الوضع الصارم هو ميزة جديدة لـ ECMASCRIPT 5. يتيح لك وضع البرنامج بأكمله ، أو وظيفة ، في سياق التشغيل "الصارم". يمنع هذا السياق الصارم عمليات معينة ويلقي المزيد من الاستثناءات.
على الرغم من أن ECMASCRIPT 5 متوافق مع ECMASCRIPT 3 ، في الوضع الصارم ، يتم تعطيل جميع الميزات التي لا يتم تفضيلها في ECMASCRIPT 3 (أو إلقاء خطأ) بدلاً من التوافق.
تمكين الوضع الصارم له الفوائد التالية:
1. التقاط بعض أخطاء البرمجة ورمي الاستثناءات.
2. منع بعض العمليات "غير الآمنة" نسبيًا (مثل الوصول إلى المتغيرات العالمية) من إجراء وإلقاء استثناءات.
3. تعطيل بعض الميزات المربكة.
يمكن العثور على معظم المعلومات حول الوضع الصارم في الصفحة 223 من رمز ES5 [PDF].
(ملاحظة: يختلف الوضع الصارم لـ ECMASCRIPT 5 عن الوضع الصارم لـ Firefox)
كيفية تمكين الوضع الصارم
أضف هذا البيان في بداية البرنامج لتمكين الوضع الصارم للنص بالكامل:
نسخة الكود كما يلي:
"استخدام صارم" ؛
يمكنك أيضًا تمكين الوضع الصارم فقط داخل الوظيفة ، حتى لا يؤثر على الخارج:
نسخة الكود كما يلي:
وظيفة imstrict () {
"استخدام صارم" ؛
// ... رمزك ...
}
إن العبارة التي تتيح الوضع الصارم مجرد سلسلة عادية "استخدم صارمة" ، دون أي بناء جملة جديد. هذا يعني أنه لن يكون هناك تأثير سلبي على المتصفح القديم.
يتمثل أحد التطبيقات العملية لتمكين الوضع الصارم داخل الوظيفة في تحديد مكتبة فئة JavaScript بأكملها داخل وظيفة الوضع الصارم ، بحيث لا تؤثر على الرمز الخارجي:
نسخة الكود كما يلي:
// رمز غير متخلف ...
(وظيفة(){
"استخدام صارم" ؛
// حدد مكتبتك بدقة ...
}) () ؛
// رمز غير متخلف ...
إذن ، ما هي التغييرات التي تم إجراؤها في البرامج النصية في الوضع الصارم؟
المتغيرات والخصائص
سيفشل تعيين متغير غير محدد بدلاً من استخدام هذا المتغير كمتغير عالمي.
إن كتابة خاصية تحتوي على خاصية قابلة للكتابة خاطئة ، أو حذف خاصية باستخدام خاصية قابلة للتكوين مع خاصية ، أو إضافة خاصية ذات خاصية قابلة للتمديد مع خطأ ، ستؤدي إلى خطأ (يتم تداول هذه الخصائص مسبقًا). في الماضي ، لم ترمي هذه العمليات استثناءات ، لكنها فشلت بصمت.
إن إجراء عمليات الحذف على المتغيرات أو الوظائف أو معلمات الوظائف سيؤدي إلى خطأ.
نسخة الكود كما يلي:
var foo = 'test' ؛
وظيفة اختبار () {}
حذف فو ؛ // خطأ
حذف الاختبار // خطأ
وظيفة test2 (arg) {
حذف Arg. // خطأ
}
سيؤدي تحديد العقار نفسه داخل حاوية كائن إلى إلقاء الاستثناء:
نسخة الكود كما يلي:
// خطأ
{foo: True ، Foo: false}
تقييم
أي استخدام لاسم "eval" (الغرض الرئيسي هو توجيه وظيفة eval إلى خاصية المتغير أو الكائن) يحظر.
نسخة الكود كما يلي:
// جميع الأخطاء ...
obj.eval = ...
obj.foo = eval ؛
var eval = ... ؛
لـ (var eval in ...) {}
وظيفة eval () {}
اختبار الوظيفة (eval) {}
وظيفة (eval) {}
وظيفة جديدة ("تقييم")
بالإضافة إلى ذلك ، فإن إعلان المتغيرات الجديدة من خلال EVAL سيكون غير صالح أيضًا:
نسخة الكود كما يلي:
eval ("var a = false ؛") ؛
طباعة (typeof a) ؛ // غير محدد
وظيفة
إعادة كتابة كائن وسيطات سيؤدي إلى خطأ:
نسخة الكود كما يلي:
الحجج = [...] ؛ // غير مسموح به
المعلمات مع نفس الاسم سوف تسبب خطأ:
نسخة الكود كما يلي:
(وظيفة (فو ، فو) {}) // خطأ
الوصول إلى الحجج. Caller و Desuments.Callee يلقي استثناء. لذلك ، يجب تسمية أي وظيفة مجهولة التي يجب استخدامها أولاً ، على سبيل المثال:
نسخة الكود كما يلي:
setTimeout (وظيفة لاحقًا () {
// افعل الأشياء ...
setTimeout (لاحقًا ، 1000) ؛
} ، 1000) ؛
لم تعد خصائص الوسيطات والمتصل والمتصل في الوظيفة موجودة ، كما أن العملية لتعريفها محظورة أيضًا.
نسخة الكود كما يلي:
وظيفة اختبار () {}
test.caller = 'caller' ؛ // خطأ
أخيرًا ، تم حل خطأ طويل الأمد (ومزعج للغاية): عند استخدام NULL أو غير محدد كمعلمة الأولى للوظيفة. النموذج prototype.call أو function.prototype.apply ، سيشير هذا داخل الوظيفة إلى الكائن العالمي. والوضع الصارم سيمنع تنفيذها ورمي استثناءات:
نسخة الكود كما يلي:
(function () {...}). call (null) ؛ // استثناء
مع() { }
عبارة with () {} معلقة تمامًا في وضع صارم.