ماذا تفعل "استخدام صارم" في جافا سكريبت، وما هو السبب وراء ذلك؟

StackOverflow https://stackoverflow.com/questions/1335851

سؤال

في الآونة الأخيرة، ركضت بعض كود جافا سكريبت من خلال كروكفورد jslint., ، أعطى الخطأ التالي:

مشكلة في الخط 1 حرف 1: في عداد المفقودين عبارة "استخدام صارمة".

القيام ببعض عمليات البحث، أدركت أن بعض الناس يضيفون "use strict"; في رمز جافا سكريبت بهم. بمجرد إضافة البيان، توقف الخطأ الظهور. لسوء الحظ، لم تكشف Google عن الكثير من التاريخ وراء بيان السلسلة هذا. من المؤكد أنه يجب أن يكون لديه ما يجب القيام به مع كيفية تفسير JavaScript من قبل المتصفح، لكن ليس لدي أي فكرة عما سيكون التأثير.

إذا ماذا "use strict"; كل شيء عن، ماذا يعني ذلك، وهل لا يزال من المناسب؟

هل أي من المتصفحات الحالية تستجيب ل "use strict"; سلسلة أو هل هو للاستخدام في المستقبل؟

هل كانت مفيدة؟

المحلول

قد تهمك هذه المقالة حول وضع JavaScript الصارم: John Resig - Ecmascript 5 الوضع الصارم، JSON، والمزيد

اقتباس بعض الأجزاء المثيرة للاهتمام:

الوضع الصارم هو ميزة جديدة في Ecmascript 5 تسمح لك بتقديم برنامج، أو وظيفة، في سياق تشغيل "صارم". يمنع هذا السياق الصارم إجراءات معينة من اتخاذها وترمي استثناءات أكثر.

و:

وضع صارم يساعد في طرق بضع

  • يملح بعض الغلطات المشتركة المشتركة، ورمي الاستثناءات.
  • يمنع الأخطاء، أو رمي الأخطاء، عند اتخاذ إجراءات "غير آمنة نسبيا (مثل الوصول إلى الكائن العالمي).
  • تعطيل ميزات مربكة أو مدروسة سيئة.

لاحظ أيضا أنه يمكنك تطبيق "الوضع الصارم" بالملف بأكمله ... أو يمكنك استخدامه فقط للحصول على وظيفة محددة (لا يزال نقلا عن مقال جون ريسج):

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

والتي قد تكون مفيدة إذا كان عليك خلط الكود القديم والجديد ؛-)

لذلك، أفترض أنه يشبه قليلا "use strict" يمكنك استخدام في بيرل (ومن هنا الاسم؟): يساعدك على إبداء أخطاء أقل، من خلال اكتشاف المزيد من الأشياء التي يمكن أن تؤدي إلى الكسور.

وضع صارم هو الآن بدعم من جميع المتصفحات الرئيسية.

داخل وحدات EcaScript الأصلية (مع import و export البيانات) و فصول ES6., ، يتم تمكين وضع صارم دائما ولا يمكن تعطيله.

نصائح أخرى

إنها ميزة جديدة من Ecmascript 5. كتب John Reseig ملخص جميل منه.

إنها مجرد سلسلة تضعها في ملفات JavaScript الخاصة بك (إما في الجزء العلوي من ملفك أو داخل دالة) تبدو وكأنها:

"use strict";

يجب أن يؤدي وضعه في التعليمات البرمجية الخاصة بك الآن إلى أي مشاكل مع المتصفحات الحالية لأنها مجرد سلسلة. قد يسبب ذلك مشاكل في التعليمات البرمجية الخاصة بك في المستقبل إذا كان التعليمات البرمجية الخاصة بك ينتهك البراغما. على سبيل المثال، إذا كان لديك حاليا foo = "bar" دون تحديد foo أولا، سيبدأ الكود الخاص بك في الفشل ... وهو أمر جيد في رأيي.

البيان "use strict"; يرشد المتصفح لاستخدام الوضع الصارم، وهو مجموعة ميزة مخفضة وأكثر أمانا من جافا سكريبت.

قائمة الميزات (غير شاملة)

  1. لا يتضح المتغيرات العالمية. (المصيد في عداد المفقودين var التصريحات والخط المطبخ في أسماء متغيرة)

  2. سيتم إلقاء المهام الفاشلة الصامتة خطأ في وضع صارم (تعيين NaN = 5;)

  3. سوف محاولات حذف الخصائص غير القابلة للحكومة رمي (delete Object.prototype)

  4. يتطلب جميع أسماء الممتلكات في كائن حرفي ليكون فريدا (var x = {x1: "1", x1: "2"})

  5. يجب أن تكون أسماء المعلمات الدالة فريدة من نوعها (function sum (x, x) {...})

  6. يحظر بناء جملة Octal (var x = 023; يفترض بعض Devs بشكل خاطئ أن الصفر السابق لا يفعل شيئا لتغيير الرقم.)

  7. يحظر على ذلك with الكلمة الرئيسية

  8. eval في وضع صارم لا يقدم متغيرات جديدة

  9. يحظر حذف أسماء عادية (delete x;)

  10. يحظر ربط أو تعيين الأسماء eval و arguments بأي شكل كان

  11. وضع صارم لا يعرف خصائص الاسم المستعار لل arguments كائن مع المعلمات الرسمية. (أي في function sum (a,b) { return arguments[0] + b;} هذا يعمل بسبب arguments[0] لا بد أن a وهلم جرا. في

  12. arguments.callee غير مدعومة

المرجع: الوضع الصارم, شبكة مطور موزيلا]

إذا كان الناس قلقين بشأن استخدام use strict قد يستحق التحقق من هذه المقالة:

Ecmascript 5 'وضع صارم' دعم في المتصفحات. ماذا يعني هذا؟
Novogeek.com - Krishna's Weblog

يتحدث عن دعم المتصفح، ولكن الأهم من ذلك كيفية التعامل معها بأمان:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

كلمة تحذير، كل ما تقصده مبرمجون شحن: تطبيق "use strict" إلى رمز موجود يمكن أن يكون خطرا! هذا الشيء ليس بعض لا يشعر ملصقا جيدا، سعيد الوجه الذي يمكنك صفعة على الرمز لجعله "أفضل". مع ال "use strict" براغما، سيقوم المتصفح بإلقاء الاستثناءات فجأة في أماكن عشوائية لم تخضع لمجرد ذلك لأنه في تلك البقعة تقوم بعمل شيء افتراضي / فضفاض JavaScript يسمح بسعادة ولكن جافا سكريبت أبحرج! قد يكون لديك انتهاكات صارمة تختبئ في نادرا ما تستخدم المكالمات المستخدمة في التعليمات البرمجية الخاصة بك والتي ستطرح استثناء فقط عندما يحصل في نهاية المطاف على الركض - على سبيل المثال، في بيئة الإنتاج التي يستخدمها عملاء الدفع!

إذا كنت ستأخذ الغطس، فمن الجيد تطبيقها "use strict" جنبا إلى جنب مع اختبارات الوحدات الشاملة ومهمة بناء JShint التي تم تكوينها بشكل صارم من شأنها أن تعطيك بعض الثقة أنه لا توجد ركن مظلم من الوحدة النمطية الخاصة بك التي سوف تفجر بشكل فظيع لأنك تحولت إلى وضع صارم. أو، مهلا، هنا خيار آخر: فقط لا تضيف "use strict" إلى أي من رمز إرثك، ربما أكثر أمانا بهذه الطريقة، بصراحة. بالتأكيد لا يضيف "use strict" إلى أي وحدات لا تملكها أو تحتفظ بها، مثل وحدات الطرف الثالث.

أعتقد أنه على الرغم من أنه حيوان محبوس، "use strict" يمكن أن تكون أشياء جيدة، ولكن عليك أن تفعل ذلك بشكل صحيح. أفضل وقت للذهاب صارم هو عندما يكون مشروعك غرينفيلد وأنت تبدأ من نقطة الصفر. تهيئة JSHint/JSLint مع كل التحذيرات والخيارات مكرنك بأنها ضيقة حيث يمكن لفريقك المعدة، والحصول على نظام بناء / اختبار جيد / تأكيد Du Jour Rigged Grunt+Karma+Chai, ، ثم تبدأ فقط بمناسبة جميع الوحدات الجديدة الخاصة بك "use strict". وبعد كن مستعدا لعلاج الكثير من الأخطاء والتحذيرات niggly. تأكد من أن الجميع يفهمون الجاذبية عن طريق تكوين البناء للفشل إذا JSHint/JSLint تنتج أي انتهاكات.

لم يكن مشروعي مشروع غرينفيلد عندما اعتمدت "use strict". وبعد نتيجة لذلك، فإن IDE مليء بالعلامات الحمراء لأنني لا أملك "use strict" على نصف وحداتي، وتشكو jshint من ذلك. إنه تذكير لي حول ما إعادة صياغة يجب أن أفعله في المستقبل. هدفي هو أن تكون علامة حمراء مجانية بسبب كل مفقود "use strict" البيانات، ولكن هذه هي السنوات بعيدا الآن.

استخدام 'use strict'; لا يجعل فجأة رمز أفضل.

ال وضع صارم جافا سكريبت هي ميزة في ecmascript 5.. وبعد يمكنك تمكين الوضع الصارم من خلال إعلان ذلك في الجزء العلوي من البرنامج النصي / الوظيفة.

'use strict';

عندما يرى محرك جافا سكريبت هذا التوجيه, ، ستبدأ في تفسير التعليمات البرمجية في وضع خاص. في هذا الوضع، يتم إلقاء الأخطاء عندما يتم اكتشاف بعض ممارسات الترميز التي يمكن أن ينتهي الأمر بالحشرات المحتملة (وهي المنطق وراء الوضع الصارم).

النظر في هذا المثال:

var a = 365;
var b = 030;

في هاجسهم يصطاد الحرف الحرفي الرقمي، قام المطور بتهيئة المتغير غير قصد b مع الحرفي ثماني. سوف الوضع غير الصارم يفسر هذا كحرف رقمي مع القيمة 24 (في قاعدة 10). ومع ذلك، سوف وضع صارم رمي خطأ.

للحصول على قائمة غير شاملة من التخصصات في وضع صارم، انظر هذه الإجابة.


أين يجب أن أستخدم 'use strict';?

  • في الجديد تطبيق جافا سكريبت: قطعاً! يمكن استخدام الوضع الصارم كخمس عندما تقوم بعمل شيء غبي مع التعليمات البرمجية الخاصة بك.

  • في موجود رمز جافا سكريبت: على الاغلب لا! إذا كان لديك رمز JavaScript الموجود لديك عبارات محظورة في الوضع الصارم، فسيكون التطبيق ببساطة. إذا كنت تريد وضع صارم، يجب أن تكون مستعدا لتصحيح وتصحيح التعليمات البرمجية الموجودة. هذا هو السبب استخدام 'use strict'; لا يجعل الشفرة فجأة أفضل.


كيف يمكنني استخدام الوضع الصارم؟

  1. إدراج 'use strict'; بيان على رأس البرنامج النصي الخاص بك:

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....
    

    لاحظ أن كل شيء في الملف myscript.js سيتم تفسيرها في وضع صارم.

  2. أو، أدخل 'use strict'; بيان أعلى لجسم وظيفة الخاص بك:

    function doSomething() {
        'use strict';
        ...
    }
    

    كل شيء في النطاق المعجمي من الوظيفة doSomething سيتم تفسيرها في وضع صارم. الكلمة النطاق المعجمي مهم هنا. يرى هذه الإجابة للحصول على تفسير أفضل.


ما الأشياء المحظورة في الوضع الصارم؟

لقد وجدت ال مقال جميل وصف العديد من الأشياء المحظورة في الوضع الصارم (لاحظ أن هذه ليست قائمة حصرية):

مجال

تاريخيا، تم الخلط بين جافا سكريبت حول كيفية استبطان الوظائف. في بعض الأحيان يبدو أنهم محروتوا قانونيا، لكن بعض الميزات تجعلهم يتصرفون كما لو أنهم كفر ديناميكيا. هذا مربك، مما يجعل البرامج يصعب قراءتها وفهمها. سوء الفهم يسبب البق. إنها أيضا مشكلة للأداء. من شأنها أن تسمح النطاق الثابت بربط متغير أن يحدث في وقت الترجمة، ولكن متطلبات النطاق الديناميكي يعني أن التوصيل يجب تأجيل وقت التشغيل، والتي تأتي مع عقوبة أداء مهمة.

يتطلب الوضع الصارم أن تتم جميع الربط المتغير بشكل ثابت. وهذا يعني أن الميزات التي تتطلب التلزام الديناميكي المطلوب سابقا يجب القضاء عليها. على وجه التحديد، يتم القضاء على بيان مع عبارة، وقدرة وظيفة EVEN على العبث مع بيئة المتصل بها مقيدة بشدة.

واحدة من فوائد التعليمات البرمجية الصارمة هي أن الأدوات مثل ضاغط يوييمكن أن تفعل وظيفة أفضل عند معالجة ذلك.

المتغيرات العالمية الضمنية

جافا سكريبت لديها متغيرات عالمية ضمنية. إذا كنت لا تعلن صراحة متغيرا، فإن المتغير العالمي أعلن ضمنا لك. هذا يجعل البرمجة أسهل للمبتدئين لأنهم يستطيعون إهمال بعض أعمال التدبير المنزلي الأساسي. لكنه يجعل إدارة البرامج الأكبر أكثر صعوبة بكثير وترط بين الموثوقية بشكل كبير. لذلك في وضع صارم، لم تعد المتغيرات العالمية الضمنية. يجب أن تعلن صراحة جميع المتغيرات الخاصة بك.

تسرب العالم

هناك عدد من المواقف التي قد تسبب thisأن تكون مرتبطة بالكائن العالمي. على سبيل المثال، إذا نسيت تقديم new بادئة عند استدعاء وظيفة منشئ، المنشئ this سيتم ربطه بشكل غير متوقع للكائن العالمي، لذلك بدلا من تهيئة كائن جديد، فسيكون ذلك العبث بصمت مع المتغيرات العالمية. في هذه الحالات، سيتم ربط الوضع الصارم بدلا من ذلك this ل undefined, مما سيؤدي إلى إلقاء المنشئ باستثناء استثناء بدلا من ذلك، مما يسمح بالكشف عن الخطأ في وقت أقرب وقت.

فشل صاخبة

كان لدى JavaScript دائما خصائص للقراءة فقط، لكنك لا تستطيع خلقها بنفسك حتى ES5 Object.createPropertyوظيفة مكشوفة هذه القدرة. إذا حاولت تعيين قيمة إلى خاصية للقراءة فقط، فستفشل بصمت. لن تؤدي المهمة إلى تغيير قيمة العقار، لكن برنامجك سيمضي كما لو كان لديه. هذا خطر النزاهة التي يمكن أن تسبب برامج للذهاب إلى دولة غير متناسقة. في وضع صارم، ستقوم محاولة تغيير خاصية للقراءة فقط رمي استثناء.

واثال

كان تمثيل الأرقام (أو الأساس 8) مفيدا للغاية عند القيام برمجة على مستوى الماكينات على الآلات التي كانت أحجام كلماتها مضاعفة 3. كنت بحاجة إلى Octal عند العمل باستخدام المركز الحالي CDC 6600، والذي كان لديه حجم كلمة 60 بت. إذا استطعت قراءة Octal، فيمكنك أن تنظر إلى كلمة ك 20 رقما. تمثل رقمان رمز المرجع، وحدد رقم واحد واحد من 8 سجلات. أثناء الانتقال البطيء من رموز الآلات إلى لغات رفيعة المستوى، كان يعتقد أنه من المفيد تقديم أشكال أوكتال لغات البرمجة.

في ج، تم اختيار تمثيل مؤسف للغاية للانتظام: الرائدة الصفر. لذلك في ج، 0100 يعني 64، وليس 100، و 08 خطأ، وليس 8. حتى أكثر لسوء الحظ، تم نسخ مفارقة الأقدار هذه إلى جميع اللغات الحديثة تقريبا، بما في ذلك جافا سكريبت، حيث يتم استخدامها فقط لإنشاء أخطاء. ليس لديه غرض آخر. لذلك في الوضع الصارم، لم تعد نماذج Octal مسموح بها.

إلى آخره

تصبح مجموعة الوسود الزائفة تشبه مجموعة أكبر قليلا في ES5. في وضع صارم، يخسر لها callee و callerملكيات. هذا يجعل من الممكن تمرير الخاص بك arguments إلى رمز غير موثوق به دون التخلي عن الكثير من السياق السرية. أيضا، arguments يتم القضاء على ملكية الوظائف.

في وضع صارم، ستنتج المفاتيح المكررة في وظيفة حرفية خطأ في بناء جملة. لا يمكن أن تحتوي الوظيفة على معلمين بنفس الاسم. لا يمكن أن تحتوي الوظيفة على متغير بنفس الاسم كأحد معلماته. وظيفة لا delete المتغيرات الخاصة بها. محاولة ل delete خاصية غير قابلة للتكوين ترمي الآن استثناء. القيم البدائية غير ملفوفة ضمنا.


كلمات محفوظة لإصدارات جافا سكريبت في المستقبل

Ecmascript 5 يضيف قائمة بالكلمات المحجوزة. إذا كنت تستخدمها كمتغيرات أو حجج، فسيقوم وضع صارم بإلقاء خطأ. الكلمات المحجوزة هي:

implements, interface, let, package, private, protected, public, static, ، و yield


قراءة متعمقة

أوصي بشدة أن يبدأ كل مطور في وضع صارم الآن. هناك متصفحات كافية تدعمها هذا الوضع الصارم سيساعدنا بشكل شرعي في إنقاذنا من الأخطاء التي لم نعرف حتى في التعليمات البرمجية الخاصة بك.

على ما يبدو، في المرحلة الأولية، ستكون هناك أخطاء لم نواجهها من قبل. للحصول على الفائدة الكاملة، نحتاج إلى القيام بالاختبار السليم بعد التبديل إلى وضع صارم للتأكد من أننا اشتعلت كل شيء. بالتأكيد نحن لا نرمي فقط use strict في كودنا ويفترض أنه لا توجد أخطاء. لذا فإن Churn هو حان الوقت للبدء في استخدام ميزة اللغة المفيدة بشكل لا يصدق لكتابة رمز أفضل.

علي سبيل المثال،

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

jslint. هو مصحح مصحح كتبه دوغلاس كروكفورد. ما عليك سوى لصق في البرنامج النصي الخاص بك، وسيتم فحصها بسرعة لأي مشكلات وأخطاء ملحوظة في التعليمات البرمجية.

أود تقديم إجابة أكثر تأسيسا إلى حد ما تكمل الإجابات الأخرى. كنت آمل أن تحرير الإجابة الأكثر شعبية، لكنها فشلت. حاولت أن أجعلها شاملة وكاملة قدر الإمكان.

يمكنك الرجوع إلى وثائق MDN. للمزيد من المعلومات.

"use strict" توجيه قدم في ecmascript 5.

توجيهات مشابهة للبيانات، ولكن مختلفة.

  • use strict لا يحتوي على كلمات رئيسية: التوجيه عبارة عبارة تعبيرية بسيطة، والتي تتكون من سلسلة خاصة حرفية (في اقتباسات واحدة أو مزدوجة). محركات جافا سكريبت، التي لا تنفذ Ecmascript 5، مجرد رؤية بيان تعبير دون آثار جانبية. من المتوقع أن تعرض الإصدارات المستقبلية لمعايير EcaScript use ككلمة رئيسية حقيقية؛ ونقلت من شأنها أن تصبح عفا عليها الزمن.
  • use strict يمكن استخدامها فقط في بداية برنامج نصي أو وظيفة، أي يجب أن تسبق كل عبارة أخرى (حقيقية). ليس من الضروري أن تكون أول تعليمات في برنامج نصي من الوظيفة: يمكن أن يسبق تعبيرات بيان أخرى تتكون من حرفيات السلسلة (ويمكن أن تعاملها من تطبيقات الجافاسكريبت مع توجيهات محددة في التنفيذ). عبارات حرفية السلسلة، والتي تتبع العبارة الحقيقية الأولى (في برنامج نصي أو وظيفة) عبارات تعبيرية بسيطة. يجب أن لا يفسرهم المترجميون على أنها توجيهات وليس لها أي تأثير.

ال use strict يشير التوجيه إلى أن التعليمات البرمجية التالية (في البرنامج النصي أو وظيفة) هو رمز صارم. يعتبر الرمز في أعلى مستوى من البرنامج النصي (التعليمات البرمجية غير الموجودة في وظيفة) رمز صارم عندما يحتوي البرنامج النصي على use strict التوجيه. يعتبر محتوى الوظيفة رمز صارم عندما يتم تعريف الوظيفة نفسها في رمز صارم أو عندما تحتوي الوظيفة على use strict التوجيه. الرمز الذي يتم تمريره إلى eval() تعتبر الطريقة شفافة صارمة عندما eval() تم استدعاء من رمز صارم أو يحتوي على use strict التوجيه نفسه.

يعد الوضع الصارم ل Ecmascript 5 مجموعة فرعية مقيدة من لغة JavaScript، مما يلغي العجز ذات الصلة باللغة والميزات التحقق من الأخطاء الأكثر صرامة وأمن أعلى. فيما يلي قوائم الاختلافات بين الوضع الصارم والوضع العادي (منها الثلاثة الأولى مهمة بشكل خاص):

  • لا يمكنك استخدام with-Statement في وضع صارم.
  • في الوضع الصارم، يجب الإعلان عن جميع المتغيرات: إذا قمت بتعيين قيمة مع معرف لم يتم الإعلان عنها كمتغير، وظيفية، ومعلمة وظيفة، فقم بالقبض معلمة أو خاصية Object, ، ثم سوف تحصل على ReferenceError. وبعد في الوضع العادي، يتم الإعلان عن المعرف ضمنا كأقل عالمي (كممتلكات عالمية Object)
  • في وضع صارم الكلمة الرئيسية this لديه القيمة undefined في الوظائف التي تم الاحتجاج بها كوظائف (وليس الأساليب). (في الوضع العادي this يشير دائما إلى العالم Object). يمكن استخدام هذا الاختلاف لاختبار ما إذا كان التنفيذ يدعم الوضع الصارم:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • أيضا عند استدعاء الوظيفة call() أو apply في وضع صارم، ثم this هو بالضبط قيمة الحجة الأولى لل call()أو apply() استدعاء. (في الوضع العادي null و undefined يتم استبدالها العالمية Object والقيم، والتي ليست كائنات، يتم وضعها في كائنات.)

  • في وضع صارم سوف تحصل على TypeError, ، عند محاولة تعيين خصائص Readonly أو تحديد خصائص جديدة لكائن غير قابل للتوسيع. (في الوضع العادي، فشل سواء ببساطة دون رسالة خطأ.)

  • في وضع صارم، عند تمرير التعليمات البرمجية eval(), ، لا يمكنك إعلان أو تعريف المتغيرات أو الوظائف في نطاق المتصل (كما يمكنك القيام بذلك في الوضع العادي). بدلا من ذلك، يتم إنشاء نطاق جديد ل eval() والمتغيرات والوظائف هي في حدود هذا النطاق. هذا النطاق دمر بعد eval() ينتهي التنفيذ.
  • في الوضع الصارم، تحتوي الحجج - كائن الوظيفة على نسخة ثابتة من القيم، والتي يتم تمريرها إلى هذه الوظيفة. في الوضع العادي، يتمتع كائن الحجج بسلوك "سحري" إلى حد ما: مرجع عناصر الصفيف ومعلمات الوظائف المسماة بنفس القيمة.
  • في وضع صارم سوف تحصل على SyntaxError عندما delete يتبع المشغل معرف غير مؤهل (متغير أو وظيفة أو وظيفة وظيفة). في الوضع العادي delete تعبير لن يفعل شيئا ويتم تقييمه ل false.
  • في وضع صارم سوف تحصل على TypeError عند محاولة حذف خاصية غير قابل للتكوين. (في الوضع العادي، فشلت محاولة ببساطة و delete يتم تقييم التعبير ل false).
  • في الوضع الصارم، يعتبر خطأ نصي بسيط عند محاولة تحديد العديد من الخصائص بنفس الاسم لكائن حرفي. (في الوضع العادي لا يوجد خطأ.)
  • في الوضع الصارم، يعتبر خطأ بسيطا عندما يحتوي إعلان الوظيفة على معلمات متعددة بنفس الاسم. (في الوضع العادي لا يوجد خطأ.)
  • في الوضع الصارم، لا يسمح بالحرف الثماني (هذه حرفيات تبدأ معها 0x. وبعد (في الوضع العادي، تسمح بعض التطبيقات بالضروات البرمية.)
  • في وضع صارم المعرفات eval و arguments تعامل مثل الكلمات الرئيسية. لا يمكنك تغيير قيمتها، ولا يمكن تعيين قيمة لهم، ولا يمكنك استخدامها كأسماء للمتغيرات أو الوظائف ومعلمات الوظائف أو معرفات كتلة الصيد.
  • في الوضع الصارم هي المزيد من القيود على الاحتمالات لفحص مكدس المكالمة. arguments.caller و arguments.callee تسبب TypeError في وظيفة في وضع صارم. علاوة على ذلك، بعض خصائص المتصل والجدات للوظائف في الوضع الصارم TypeError عند محاولة قراءتها.

سنتى:

أحد أهداف الوضع الصارم هو السماح بتصحيح الأخطاء الأسرع للقضايا. يساعد المطورين من خلال إلقاء الاستثناء عند حدوث بعض الأشياء الخاطئة التي يمكن أن تسبب سلوكا صامتا وغريبا في صفحة الويب الخاصة بك. اللحظة التي نستخدمها use strict, ، سيقوم الرمز بإلقاء الأخطاء التي تساعد المطور على إصلاحه مسبقا.

بعض الأشياء المهمة التي تعلمتها بعد استخدامها use strict :

يمنع إعلان المتغير العالمي:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

الآن، يخلق هذا الرمز nameoftree في النطاق العالمي الذي يمكن الوصول إليه باستخدام window.nameoftree. وبعد عندما ننفذنا use strict الرمز سوف رمي خطأ.

recertuca releverror: NameOftree غير محدد

عينة

يقضي على with بيان :

with لا يمكن تصريح البيانات باستخدام أدوات مثل uglify-JS.. وبعد انهم أيضا إهمال وإزالتها من إصدارات جافا سكريبت المستقبلية.

عينة

يمنع التكرارات:

عندما يكون لدينا خاصية مكررة، فإنه يلقي استثناء

SyntaxError غير المكرر: خاصية البيانات المكررة في كائن حرفي غير مسموح به في وضع صارم

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

هناك عدد قليل منهم ولكنني بحاجة إلى الحصول على المزيد من المعرفة في ذلك.

إذا كنت تستخدم متصفح تم إصداره في العام الماضي أو نحو ذلك، فمن المرجح أن يدعم الوضع الصارم JavaScript. أصبحت المتصفحات الأكبر سنا فقط قبل أن أصبحت Ecmascript 5 المعيار الحالي لا يدعمه.

التأكد من اقتباسات الأمر حول الأمر أن الرمز سيظل يعمل في المتصفحات القديمة أيضا (على الرغم من أن الأشياء التي تولد خطأ في بناء جملة في الوضع الصارم ستتسبب عموما فقط البرنامج النصي في بعض الصعب اكتشاف الطريقة التي يصعب اكتشافها في تلك المتصفحات القديمة).

عند الإضافة "use strict";, ، الحالات التالية سوف رمي خطأ في بناء الجملة قبل تنفيذ البرنامج النصي:

  • يمهد الطريق للحصول على إصدارات EcaScript المستقبلية, باستخدام واحدة من الكلمات الرئيسية المحجوزة حديثا (في المحترم ecmascript 6.): implements, interface, let, package, private, protected, public, static, ، و yield.

  • إعلان وظيفة في كتل

    if(a<b){ function f(){} }
    
  • بناء الجملة ثماني

    var n = 023;
    
  • this أشر إلى الكائن العالمي.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • يعلن مرتين نفس الاسم لاسم العقار في كائن حرفي

     {a: 1, b: 3, a: 7} 
    

    لم يعد هذا هو الحال في Ecmascript 6 (علة 1041128.).

  • إعلان وسيطتين وظيفة مع نفس وظيفة الاسم

    f(a, b, b){}
    
  • تحديد قيمة متغير غير محدد

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • استخدام delete على اسم متغير delete myVariable;

  • استخدام eval أو arguments كمتغير أو اسم الوساطة وظيفة

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

مصادر:

وضع صارم يجعل العديد من التغييرات في دلالات JavaScript العادية:

  • يزيل بعض الأخطاء الصامتة JavaScript عن طريق تغييرها لرمي الأخطاء.

  • إصلاح الأخطاء التي تجعل من الصعب على محركات JavaScript لأداء التحسينات.

  • يحظر تعريف بعض بناء الجملة المحدد في الإصدارات المستقبلية من Ecmascript.

لمزيد من المعلومات Vistit وضع صارم - جافا سكريبت

"استخدم صارمة"؛ هو التأمين الذي لن يستخدمه مبرمج الخصائص فضفاضة أو سيئة لجافا سكريبت. إنه دليل، تماما مثل الحاكم سوف يساعدك في جعل خطوط مستقيمة. "استخدام صارم" سوف تساعدك على القيام ب "الترميز المستقيم".

أولئك الذين يفضلون عدم استخدام الحكام للقيام خطوطهم على التوالي عادة ما ينتهي بهم المطاف في تلك الصفحات التي تطلب تصحيح الآخرين.

صدقني. النفقات العامة ضئيلة مقارنة مع التعليمات البرمجية سيئة التصميم. دوج كروكفورد، الذي كان مطور جافا سكريبت كبير لعدة سنوات، لديه وظيفة مثيرة جدا للاهتمام هنا. وبعد شخصيا، أحب العودة إلى موقعه طوال الوقت للتأكد من أنني لا أنسى ممارستي الجيدة.

يجب أن تثير ممارسة JavaScript الحديثة دائما "استخدام صارم"؛ براغما. السبب الوحيد الذي جعلت مجموعة ECMA وضع "صارم" اختياري هو السماح بإمكانية الوصول إلى JavaScript أقل خبرة وإعطاء الوقت للتكيف مع ممارسات الترميز الجديدة والأكثر أمانا.

مشتمل use strict في بداية جميع ملفات JavaScript الحساسة الخاصة بك من هذه النقطة هي وسيلة صغيرة لتكون مبرمج جافا سكريبت أفضل وتجنب أن تصبح المتغيرات العشوائية العالمية والأشياء تتغير بصمت.

نقلا عن W3Schools.:

توجيه "استخدام صارم"

إن توجيه "استخدام صارم" جديد في JavaScript 1.8.5 (Ecmascript الإصدار 5).

ليس عبارة، ولكن التعبير الحرفي، تجاهلها الإصدارات السابقة من جافا سكريبت.

الغرض من "استخدام صارم" هو الإشارة إلى أنه يجب تنفيذ التعليمات البرمجية في "الوضع الصارم".

مع وضع صارم، لا يمكنك ذلك، على سبيل المثال، استخدام المتغيرات غير المعلنة.

لماذا وضع صارم؟

وضع صارم يجعل من السهل كتابة جافا سكريبت "آمنة".

التغييرات الصارمة التغييرات التي تم قبولها سابقا "بناء الجملة السيئ" في أخطاء حقيقية.

كمثال، في JavaScript العادي، يخطئ أخطاء اسم متغير متغير عالمي جديد. في وضع صارم، سيقوم هذا بإلقاء خطأ، مما يجعل من المستحيل إنشاء متغير عالمي عن طريق الخطأ.

في JavaScript العادي، لن يتلقى المطور أي تعليقات خطأ في تعيين القيم إلى الخصائص غير القابلة للكتابة.

في الوضع الصارم، فإن أي مهمة لممتلكات غير قابلة للكتابة، خاصية Getter-Only، خاصية غير موجودة، متغير غير موجود، أو كائن غير موجود، ستقوم بإلقاء خطأ.

يرجى الرجوع إلى http://www.w3schools.com/js/js_strict.asp.as. لمعرفة المزيد

"use strict" يجعل رمز JavaScript ليتم تشغيله الوضع الصارم, ، والتي تعني أساسا أن كل شيء يحتاج إلى تعريفه قبل الاستخدام. السبب الرئيسي لاستخدام الوضع الصارم هو تجنب الاستخدامات العالمية العرضية لأساليب غير محددة.

أيضا في الوضع الصارم، تعمل الأمور بشكل أسرع، بعض التحذيرات أو التحذيرات الصامتة رمي أخطاء قاتلة، من الأفضل دائما استخدامها دائما لجعل رمز NEATER.

"use strict" هناك حاجة ماسة لاستخدامها في ECMA5، في ECMA6 انها جزء من جافا سكريبت افتراضيا, ، لذلك لا يحتاج إلى إضافته إذا كنت تستخدم ES6.

إلقاء نظرة على هذه البيانات والأمثلة من MDN:

توجيه "استخدام صارم"
إن توجيه "استخدام صارم" جديد في JavaScript 1.8.5 (Ecmascript الإصدار 5). ليس عبارة، ولكن التعبير الحرفي، تجاهلها الإصدارات السابقة من جافا سكريبت. الغرض من "استخدام صارم" هو الإشارة إلى أنه يجب تنفيذ التعليمات البرمجية في "الوضع الصارم". مع وضع صارم، لا يمكنك ذلك، على سبيل المثال، استخدام المتغيرات غير المعلنة.

أمثلة على استخدام "استخدام صارم":
وضع صارم للوظائف: وبالمثل، استدعاء الوضع الصارم لوظيفة، ضع العبارة الدقيقة "استخدام صارمة"؛ (أو "استخدام صارم"؛) في جسم الوظيفة قبل أي بيانات أخرى.

1) وضع صارم في وظائف

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) وضع صارم النص الكامل

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) التعيين إلى عالم عالمي غير قابل للكتابة

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

تستطيع اقرأ المزيد عن MDN.

هناك حديث جيد من قبل بعض الأشخاص الذين كانوا في لجنة Ecmascript: التغييرات في جافا سكريبت، الجزء 1: Ecmascript 5 " حول كيفية الاستخدام الإضافي لل "use strict" يسمح التبديل بمنفذين JavaScript بتنظيف الكثير من الميزات الخطرة لجافا سكريبت دون كسر كل موقع على الويب فجأة في العالم.

بالطبع يتحدث أيضا عن ما هي الكثير من هذه الأشياء الخاطئة (كانت) وكيف يقوم Ecmascript 5 بإصلاحها.

أمثلة صغيرة للمقارنة:

الوضع غير الصارم:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

الوضع الصارم:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

الوضع غير الصارم:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true

لاحظ أن use strict تم تقديمه في ecmascript 5. وتم الاحتفاظ منذ ذلك الحين.

فيما يلي شروط لتشغيل وضع صارم في ES6. و ES7.:

  • الرمز العالمي هو رمز الوضع الصارم إذا كان يبدأ مع مقدمة التوجيه التي تحتوي على توجيه صارم استخدم (انظر 14.1.1).
  • رمز الوحدة النمطية هو دائما رمز الوضع الصارم.
  • جميع أجزاء من ClassDeClaration. أو أ classexpression هي رمز الوضع الصارم.
  • رمز Eval هو رمز وضع صارم إذا كان يبدأ بوجود توجيهي يحتوي على توجيهات صارمة أو إذا كانت المكالمة إلى Eval هي EVENT مؤشر مباشر (انظر 12.3.4.1) الموجود في رمز الوضع الصارم.
  • رمز الوظيفة هو رمز الوضع الصارم إذا كان المرتبط وظيفة الدوالة، وظيفية، والأدوات المرتبطة، والجماد، أو المنهجية، أو arrowfunction ويرد في رمز الوضع الصارم أو إذا كان التعليمات البرمجية التي تنتج قيمة الفتحة الداخلية [[ecmascriptcodeCode]] تبدأ مع مقدمة التوجيهات التي تحتوي على توجيه صارم للاستخدام.
  • رمز الوظيفة الذي يتم توفيره كوسائط إلى الوظيفة المدمجة ومؤسسات المولدات هو رمز الوضع الصارم إذا كانت الوسيطة الأخيرة هي سلسلة تعمل عند المعالجة وظيفة التي تبدأ بتثقرات توجيهية تحتوي على توجيه قوي الاستخدام.

الأسباب الرئيسية التي تجعل المطورين يجب استخدامها "use strict" نكون:

  1. يمنع الإعلان العرضي للمتغيرات العالمية "use strict()" سوف نتأكد من إعلان المتغيرات var قبل الاستعمال. على سبيل المثال:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    
  2. ملحوظة: "use strict" يتم التعرف على التوجيه فقط في بداية البرنامج النصي أو وظيفة.
  3. السلسلة "arguments" لا يمكن استخدامها كمتغير:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. سوف تقيد استخدامات الكلمات الرئيسية كمتغيرات. محاولة استخدامها سوف رمي الأخطاء.

باختصار، سيجعل رمزك أقل عرضة للخطأ وفي الدوران سيجعلك تكتب رمز جيد.

لقراءة المزيد عن ذلك يمكنك الرجوع هنا.

"استخدم صارمة"؛ هو جهد ECMA لجعل جافا سكريبت أكثر قوة قليلا. إنه يجلب JS محاولة لجعله على الأقل قليلا "صارمة" (هناك لغات أخرى تنفذ قواعد صارمة منذ التسعينيات). في الواقع "القوات" لمطوري جافا سكريبت لمتابعة نوع من أفضل الممارسات الترميز. لا يزال، جافا سكريبت هش جدا. لا يوجد شيء مثل المتغيرات المكتوبة، والطرق المكتوبة، وما إلى ذلك. أنا أوصي بشدة مطوري جافا سكريبت لتعلم لغة أكثر قوة مثل Java أو Actioncript3، وتنفيذ نفس أفضل الممارسات في رمز JavaScript الخاص بك، وسوف تعمل بشكل أفضل وتكون أسهل تصحيح.

تم تقديم وضع JavaScript "الصارم" في Ecmascript 5.

(function() {
  "use strict";
  your code...
})();

جاري الكتابة "use strict"; في الجزء العلوي جدا من ملف JS الخاص بك يتحول إلى فحص بناء الجملة الصارم. يفعل المهام التالية بالنسبة لنا:

  1. يظهر خطأ إذا حاولت تعيين متغير غير محدد

  2. يمنعك من مكتبات نظام JS Key

  3. يحظر بعض ميزات اللغة غير الآمنة أو غير المعرضة للخطأ

use strict يعمل أيضا داخل الوظائف الفردية. إنها دائما ممارسة أفضل لتشمل use strict في التعليمات البرمجية الخاصة بك.

مشكلة توافق المتصفح: تهدف توجيهات "الاستخدام" إلى أن تكون متوافقة مع الوراء. سوف يرى المتصفحات التي لا تدعمها فقط سلسلة حرفية لا تتم الإشارة إليها. لذلك، سوف ينقلونها والمضي قدما.

use strict هي وسيلة لجعل التعليمات البرمجية الخاصة بك أكثر أمانا، لأنك لا تستطيع استخدام الميزات الخطرة التي يمكن أن تعمل كما تتوقع. كما كان قد كتب قبل أن يجعل الرمز أكثر صرامة.

استخدام صارم يستخدم لإظهار الأخطاء الشائعة والمتكررة بحيث يتم التعامل معها بشكل مختلف، وتغيير طريقة تشغيل البرنامج النصي Java، مثل هذه التغييرات هي:

  • يمنع العالم العرضي

  • لا التكرارات

  • يزيل مع

  • يلغي هذا الإكراه

  • appr ()

  • أخطاء للمخالين

يمكنك أيضا قراءة هذا مقالة - سلعة للحصول على التفاصيل

عادة، لا تتبع جافا سكريبت قواعد صارمة، وبالتالي زيادة فرص الأخطاء. بعد استخدام "use strict", ، يجب أن يتبع رمز JavaScript مجموعة صارمة من القواعد كما هو الحال في لغات البرمجة الأخرى مثل استخدام الإنهاء والإعلان قبل التهيئة، إلخ.

لو "use strict" يستخدم، يجب كتابة التعليمات البرمجية باتباع مجموعة صارمة من القواعد، وبالتالي تقليل فرص الأخطاء والغموض.

"استخدم صارمة"؛ يحدد أن يتم تنفيذ رمز Javascript في "الوضع الصارم".

  • كان توجيه "استخدام صارم" جديد في الإصدار 5 Ecmascript 5.
  • ليس عبارة، ولكن التعبير الحرفي، تجاهلها الإصدارات السابقة من جافا سكريبت.
  • الغرض من "استخدام صارم" هو الإشارة إلى أنه يجب تنفيذ التعليمات البرمجية في "الوضع الصارم".
  • مع وضع صارم، لا يمكنك ذلك، على سبيل المثال، استخدام المتغيرات غير المعلنة.

جميع المتصفحات الحديثة دعم "استخدام صارمة" باستثناء Internet Explorer 9 وانخفاض.

غير مؤات

إذا استخدم المطور مكتبة كانت في وضع صارم، ولكن تم استخدام المطور للعمل في الوضع العادي، فقد يتصلون ببعض الإجراءات على المكتبة التي لن تعمل كما هو متوقع.

والأسوأ من ذلك، نظرا لأن المطور في الوضع العادي، فإنهم ليس لديهم مزايا الأخطاء الإضافية التي يتم طرحها، لذلك قد يفشل الخطأ بصمت.

أيضا، كما هو مذكور أعلاه، فإن الوضع الصارم يمنعك من القيام بأشياء معينة.

يعتقد الناس عموما أنه لا يجب عليك استخدام هذه الأشياء في المقام الأول، لكن بعض المطورين لا يحبون القيد وتريد استخدام جميع ميزات اللغة.

وضع صارم يمكن أن يمنع تسرب الذاكرة.

يرجى التحقق من الوظيفة أدناه المكتوبة في وضع غير صارم:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

في هذه الوظيفة، نحن نستخدم متغير يسمى name داخل الوظيفة. داخليا، سيقوم المحول البرمجي أولا بفحص ما إذا كان هناك أي متغير معلن بهذا الاسم المحدد في نطاق الوظيفة المعينة. نظرا لأن المترجم يفهم أنه لا يوجد مثل هذا المتغير، فسوف يتحقق في النطاق الخارجي. في حالتنا، هذا هو النطاق العالمي. مرة أخرى، فهم المحول البرمجي أنه لا يوجد متغير معلن في الفضاء العالمي بهذا الاسم، لذلك يخلق مثل هذا المتغير بالنسبة لنا في الفضاء العالمي. من الناحية النظرية، سيتم إنشاء هذا المتغير في النطاق العالمي وسوف تكون متاحة في التطبيق بأكمله.

سيناريو آخر هو ذلك، على سبيل المثال، يتم الإعلان عن المتغير في وظيفة الطفل. في هذه الحالة، يتحقق المحول البرمجي من صحة هذا المتغير في النطاق الخارجي، أي وظيفة الأصل. عندها فقط سوف تحقق في المساحة العالمية وإنشاء متغير بالنسبة لنا هناك. وهذا يعني أن الشيكات الإضافية تحتاج إلى القيام به. سيؤثر ذلك على أداء التطبيق.


الآن دعونا نكتب نفس الوظيفة في الوضع الصارم.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

سنحصل على الخطأ التالي.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

هنا، الترجمة يلقي الخطأ المرجعي. في وضع صارم، لا يسمح لنا المحول البرمجي باستخدام المتغير دون إعلانه. حتى تسرب الذاكرة يمكن منعها. بالإضافة إلى ذلك، يمكننا كتابة رمز أكثر الأمثل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top