"الوضع الصارم" هو بناء جملة جديد محدد في ECMA-262 Edition 5 ، مما يشير إلى أنه يحتاج إلى تنفيذه باستخدام بناء جملة JavaScript الصارم. بعض أساليب الكتابة المستخدمة في الماضي سوف ترمي استثناءات بناء الجملة ، مثل:
1. لا إعلان var قبل المتغير
2. استخدم بناء جملة الثماني: var n = 023 و var s = "/047"
3. استخدم مع البيانات
4. استخدم حذفًا لحذف اسم متغير (وليس اسم السمة): حذف MyVariable
5. استخدم eval أو الوسيطات كاسم متغير أو اسم وظيفة
6. استخدم الكلمات المحجوزة في المستقبل (ربما تستخدم في ECMASCRIPT 6): الأدوات ، واجهة ، ودع ، حزمة ، خاصة ، محمية ، عامة ، ثابتة ، وأسماء متغيرة أو أسماء الوظائف
7. استخدم إعلان الوظيفة في كتلة العبارة: if (a <b) {function f () {}}
8. أخطاء أخرى
8.1. استخدم اسمين سمة متطابقة في الكائن الفرعي الحجم: {a: 1 ، b: 3 ، a: 7}
8.2. استخدم اسم اثنين من المعلمات المتطابقة في معلمات الوظيفة: الدالة F (A ، B ، B) {}
يتم شرح هذه بالتفصيل أدناه.
1. لماذا استخدام "الوضع الصارم"
الغرض من إنشاء "نموذج صارم" هو أساسا على النحو التالي:
1. القضاء على بعض الجوانب غير المعقولة وغير المكتملة لبناء جملة JavaScript وتقليل بعض السلوكيات الغريبة ؛
2. القضاء على بعض عدم الأمان في رمز التشغيل وضمان سلامة رمز تشغيل ؛
3. تحسين كفاءة المترجم وزيادة سرعة التشغيل ؛
4. ضع الأساس للإصدار الجديد من JavaScript في المستقبل.
يعكس "الوضع الصارم" اتجاه التطوير الأكثر منطقية وأكثر أمانًا وأكثر صرامة لجافا سكريبت. لقد دعمتها المتصفحات الرئيسية بما في ذلك IE 10 بالفعل ، وقد بدأت العديد من المشاريع الرئيسية في احتضانها بالكامل.
من ناحية أخرى ، قد يكون لنفس الكود نتائج تشغيل مختلفة في "الوضع الصارم" ؛ لن يتم تشغيل بعض العبارات التي يمكن تشغيلها في "الوضع العادي" في "الوضع الصارم". سيساعدك إتقان هذه المحتويات على فهم JavaScript بعناية أكبر وبتعمق ، مما يجعلك مبرمجًا أفضل.
ستقدم هذه المقالة مقدمة مفصلة عن "النموذج الصارم".
2. إعلان "الوضع الصارم"
إعلان "الوضع الصارم" بسيط ولديه بيان واحد فقط:
نسخة الكود كما يلي: "استخدم صارمة" ؛
ملاحظة: سوف تعاملها المتصفحات القديمة كسلسلة طبيعية وتجاهلها.
3. أعلن الموقع والعلاقة السياقية لـ "الوضع الصارم"
يؤثر "الوضع الصارم" بشكل أساسي على النطاق الذي يقع فيه. إذا تم استخدامه في الوظائف ، فلن يحول النطاق العالمي وغيرها من الوظائف غير المستخدمة إلى "الوضع الصارم". أي أن نطاق إعلان النمط الصارم يعتمد على سياقه. إذا تم الإعلان عن الوضع الصارم في سياق عالمي (خارج نطاق الوظيفة) ، فإن جميع التعليمات البرمجية في البرنامج في وضع صارم. إذا تم الإعلان عن نمط صارم في وظيفة ، فإن جميع التعليمات البرمجية في الوظيفة تكون في نمط صارم. على سبيل المثال ، في المثال التالي ، تكون جميع التعليمات البرمجية في وضع صارم ، وستؤدي الإعلانات المتغيرة خارج الوظيفة إلى خطأ في بناء الجملة: "لا يتم تعريف المتغيرات في الوضع الصارم". هناك طريقتان لاستدعاء "الوضع الصارم" وهي مناسبة للمناسبات المختلفة.
1. للحصول على ملف البرنامج النصي بأكمله
ضع "استخدام صارمة" في السطر الأول من ملف البرنامج النصي وسيتم تشغيل البرنامج النصي بأكمله في "الوضع الصارم". إذا لم يكن عبارة السطر هذا على السطر الأول ، فسيكون غير صالح ويتم تشغيل البرنامج النصي بأكمله في "الوضع العادي". هذا يتطلب اهتمامًا خاصًا إذا تم دمج ملفات التعليمات البرمجية ذات الأوضاع المختلفة في ملف واحد.
(بالمعنى الدقيق للكلمة ، طالما أن البيان الذي ينتج عن النتيجة الجري الفعلية لا يسبق ، قد لا يكون "استخدام صارم" على السطر الأول ، مثل اتباع فصلي فارغة فارغة.)
نسخة الكود كما يلي:
<script>
"استخدام صارم" ؛
console.log ("هذا هو الوضع الصارم.") ؛
</script>
<script>
console.log ("هذا هو الوضع الطبيعي.") ؛
</script>
يشير الرمز أعلاه إلى وجود قطعتين من رمز JavaScript في صفحة ويب بدوره. علامة البرنامج النصي السابقة هي الوضع الصارم ، فإن الأخير ليس كذلك.
2. لوظيفة واحدة
ضع "استخدام صارم" في السطر الأول من جسم الوظيفة ، وتشغيل الوظيفة بأكملها في "الوضع الصارم".
نسخة الكود كما يلي:
وظيفة صارمة () {
"استخدام صارم" ؛
العودة "هذا نمط صارم." ؛
}
وظيفة notstrict () {
إرجاع "هذا الوضع الطبيعي." ؛
}
3. الحلول لملفات النصوص
نظرًا لأن طريقة الاتصال الأولى ليست مواتية لدمج الملف ، فمن الأفضل استعارة الطريقة الثانية ووضع ملف البرنامج النصي بالكامل في وظيفة مجهولة المصدر يتم تنفيذها على الفور.
نسخة الكود كما يلي:
(وظيفة (){
"استخدام صارم" ؛
// بعض التعليمات البرمجية هنا
}) () ؛
4. يتغير بناء الجملة والسلوك تحت "الوضع الصارم"
قام "الوضع الصارم" بإجراء بعض التغييرات على بناء الجملة وسلوك JavaScript.
1. إعلان صريح للمتغيرات العالمية
في الوضع العادي ، عند استخدام المتغيرات ، لا يتعين علينا استخدام VAR للإعلان (إعلان صراحة) ، ولكن في الوضع الصارم ، يجب أن نستخدم VAR لإعلانه قبل استخدام المتغيرات ، وإلا فإن الخطأ سيحدث.
نسخة الكود كما يلي:
"استخدام صارم" ؛
v = 1 ؛ // تم الإبلاغ عن خطأ ، لا يتم الإعلان عن v
لـ (i = 0 ؛ i <2 ؛ i ++) {// تم الإبلاغ عن خطأ ، لم يتم الإعلان عني
}
لذلك ، في الوضع الصارم ، يجب الإعلان عن المتغيرات مع أمر VAR قبل الاستخدام.
2. ربط ثابت
تتمثل ميزة لغة JavaScript في أنها تسمح "الربط الديناميكي" ، أي ، والتي تعترض بعض الخصائص والأساليب التي تنتمي إليها ، لا يتم تحديدها في وقت الترجمة ، ولكن في وقت التشغيل.
الوضع الصارم يضع بعض القيود على الربط الديناميكي. في بعض الحالات ، يُسمح فقط بالربط الثابت. بمعنى آخر ، يتم تحديد السمات والأساليب التي تنتمي إليها أثناء مرحلة التجميع. سيساعد ذلك في تحسين كفاءة التجميع ، وجعل الكود أسهل في القراءة والحوادث الأقل.
على وجه التحديد ، الجوانب التالية متورطة.
(1) يتم حظر الاستخدام مع العبارات
لأنه لا يمكن تحديد البيان في وقت الترجمة ، وهو الكائن الذي تنتمي إليه السمة.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var v = 1 ؛
مع (O) {// خطأ في بناء الجملة
v = 2 ؛
}
(2) إنشاء نطاق تقييم
في الوضع العادي ، تحتوي لغة JavaScript على نطاقين متغيران: النطاق العالمي ونطاق الوظيفة. يخلق الوضع الصارم نطاقًا ثالثًا: نطاق التقييم.
في الوضع العادي ، يعتمد نطاق عبارة eval على ما إذا كان في النطاق العالمي أو في النطاق الوظيفي. في الوضع الصارم ، يعد بيان EVAL نفسه نطاقًا ولم يعد بإمكانه إنشاء متغيرات عالمية. لا يمكن استخدام المتغيرات التي يولدها إلا داخل Eval.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var x = 2 ؛
console.info (eval ("var x = 5 ؛ x")) ؛ // 5
console.info (x) ؛ // 2
3. تدابير السلامة المعززة
(1) منع هذه الكلمة الرئيسية للإشارة إلى الكائنات العالمية
نسخة الكود كما يلي:
وظيفة f () {
العودة! هذا ؛
}
// إرجاع خطأ ، لأن "هذا" يشير إلى الكائن العالمي "! هذا" كاذب
وظيفة f () {
"استخدام صارم" ؛
العودة! هذا ؛
}
// إرجاع صحيح ، لأنه في الوضع الصارم ، فإن قيمة هذا غير محددة ، لذلك "! هذا" صحيح.
لذلك ، عند استخدام المنشئ ، إذا نسيت إضافة جديد ، فإن هذا لم يعد يشير إلى الكائن العالمي ، ولكنه يبلغ عن خطأ.
نسخة الكود كما يلي:
وظيفة f () {
"استخدام صارم" ؛
this.a = 1 ؛
} ؛
f () ؛ // error ، هذا غير محدد
في الوظيفة العادية ، استدعاء F () ، ستشير قيمة هذا إلى الكائن العالمي. في الوضع الصارم ، ستشير قيمة هذا إلى غير محدد. عندما يتم استدعاء الوظيفة من خلال الاتصال والتطبيق ، إذا كانت معلمة القيمة التي تم تمريرها هذه هي قيمة بدائية (السلسلة ، الرقم ، القيمة المنطقية) باستثناء الفارغ وغير المحددة ، فإن قيمة هذا ستصبح كائن التفاف المقابل للقيمة الأصلية. إذا كانت قيمة معلمة القيمة هذه غير محددة أو فارغة ، فستشير قيمة هذا إلى الكائن العالمي. في الوضع الصارم ، تكون قيمة هذه القيمة هي قيمة معلمة القيمة هذه ، دون أي تحويل نوع.
(2) ممنوع من اجتياز مكدس المكالمات داخل الوظيفة
نسخة الكود كما يلي:
وظيفة F1 () {
"استخدام صارم" ؛
f1.Caller ؛ // الإبلاغ عن خطأ
F1.Arguments ؛ // الإبلاغ عن خطأ
}
F1 () ؛
4. تعطيل حذف المتغيرات
لا يمكن حذف المتغيرات في وضع صارم. يمكن حذف خصائص الكائن فقط التي يتم تعيينها القابلة للتكوين على TRUE.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var x ؛
حذف x ؛ // خطأ بناء الجملة
var o = object.create (null ، 'x' ، {
القيمة: 1 ،
قابل للتكوين: صحيح
}) ؛
حذف الثور. // حذف بنجاح
5. خطأ صريح
في الوضع العادي ، إذا قمت بتعيين خاصية للقراءة فقط لكائن ، فلن تكون هناك أخطاء ، وسوف تفشل بصمت فقط. في الوضع الصارم ، سيتم الإبلاغ عن خطأ.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var o = {} ؛
Object.DefineProperty (O ، "V" ، {value: 1 ، crinbable: false}) ؛
OV = 2 ؛ // الإبلاغ عن خطأ
في الوضع الصارم ، إذا قمت بتعيين خاصية قراءة باستخدام طريقة getter ، فسيتم الإبلاغ عن خطأ.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var o = {
GET V () {return 1 ؛ }
} ؛
OV = 2 ؛ // الإبلاغ عن خطأ
في الوضع الصارم ، فإن إضافة سمات جديدة إلى الكائنات المحظورة من تمديدها ستؤدي إلى خطأ.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var o = {} ؛
Object.PreventStextensions (O) ؛
OV = 1 ؛ // الإبلاغ عن خطأ
في الوضع الصارم ، سيؤدي حذف خاصية underete إلى حدوث خطأ.
نسخة الكود كما يلي:
"استخدام صارم" ؛
حذف object.prototype ؛ // الإبلاغ عن خطأ
6. إعادة تسمية الخطأ
أضاف الوضع الصارم بعض أخطاء بناء الجملة.
(1) لا يمكن أن يكون للكائنات سمات بأسماء مكررة
في الوضع العادي ، إذا كان للكائن سمات مكررة متعددة ، فإن السمة الأخيرة المعينة ستتجاوز القيمة السابقة. في الوضع الصارم ، هذا خطأ في بناء الجملة.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var o = {
P: 1 ،
P: 2
} ؛ // خطأ بناء الجملة
(2) لا يمكن أن يكون للوظائف معلمات بأسماء مكررة
في الوضع العادي ، إذا كانت الوظيفة تحتوي على معلمات متعددة بأسماء مكررة ، فيمكن قراءتها مع الوسائط [i]. في الوضع الصارم ، هذا خطأ في بناء الجملة.
نسخة الكود كما يلي:
"استخدام صارم" ؛
دالة F (A ، A ، B) {// syntax error
يعود ؛
}
7. تدوين ثماني محظور
في الوضع العادي ، إذا كان الجزء الأول من عدد صحيح هو 0 ، فهذا يعني أن هذا هو رقم ثماني ، مثل 0100 يساوي 64 في عشري. الوضع الصارم يحظر هذا التمثيل. إذا كان الجزء الأول من عدد صحيح هو 0 ، فسيتم الإبلاغ عن خطأ.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var n = 0100 ؛ // خطأ بناء الجملة
8. قيود الكائنات الحجج
الوسائط هي كائنات معلمة للوظائف ، والوضع الصارم يحد من استخدامه.
(1) غير مسموح بتعيين الوسائط
نسخة الكود كما يلي:
"استخدام صارم" ؛
الحجج ++ ؛ // خطأ بناء الجملة
var obj = {set p (mations) {}} ؛ // خطأ بناء الجملة
جرب {} catch (وسيطات) {} // rerer
وسيطات الوظائف () {} // خطأ في بناء الجملة
var f = وظيفة جديدة ("الوسائط" ، "استخدام صارم" ؛ العودة 17 ؛ ") ؛ // خطأ بناء الجملة
(2) لم تعد الوسائط تتبع التغييرات في المعلمات
نسخة الكود كما يلي:
وظيفة f (a) {
أ = 2 ؛
إرجاع [A ، الحجج [0]] ؛
}
F (1) ؛ // الوضع العادي هو [2،2]
وظيفة f (a) {
"استخدام صارم" ؛
أ = 2 ؛
إرجاع [A ، الحجج [0]] ؛
}
F (1) ؛ // الوضع الصارم هو [2،1]
(3) استخدام الوسيطات. callee محظور
هذا يعني أنه لا يمكنك الاتصال بنفسك داخل وظيفة مجهولة.
نسخة الكود كما يلي:
"استخدام صارم" ؛
var f = function () {return arguments.callee ؛ } ؛
f () ؛ // الإبلاغ عن خطأ
9. يجب إعلان الوظيفة في المستوى الأعلى
في المستقبل ، ستقدم إصدارات جديدة من JavaScript "نطاق مستوى الكتلة". للتوافق مع الإصدار الجديد ، يسمح الوضع الصارم فقط بإعلان الوظائف في المستوى الأعلى للنطاق العالمي أو نطاق الوظيفة. أي أنه لا يُسمح بإعلان الوظائف داخل كتل التعليمات البرمجية غير الوظيفية.
نسخة الكود كما يلي:
"استخدام صارم" ؛
إذا (صحيح) {
دالة F () {} // خطأ في بناء الجملة
}
لـ (var i = 0 ؛ i <5 ؛ i ++) {
دالة F2 () {} // خطأ في بناء الجملة
}
10. الحفاظ على الكلمات
من أجل الانتقال إلى إصدار جديد من JavaScript في المستقبل ، تمت إضافة بعض الكلمات المحجوزة إلى الوضع الصارم: الأطراف ، الواجهة ، Let ، الحزمة ، خاصة ، محمية ، عامة ، ثابتة ، عائد.
سيؤدي استخدام هذه الكلمات كأسماء متغيرة إلى خطأ.
نسخة الكود كما يلي:
حزمة الوظائف (محمية) {// خطأ في بناء الجملة
"استخدام صارم" ؛
VAR تنفذ. // خطأ بناء الجملة
}
بالإضافة إلى ذلك ، ينص الإصدار الخامس من ECMASCRIPT أيضًا على الكلمات المحجوزة الأخرى (الفئة ، التعداد ، التصدير ، يمتد ، استيراد ، سوبر) ، فضلاً عن الكلمات المحجوزة التي تضاف إليها المتصفحات الرئيسية ، والتي لا يمكن استخدامها كأسماء متغيرة.