يتيح النمط الصارم الذي تم تقديمه في ECMASCRIPT5 للمطورين أن يكون لديهم لغة جافا سكريبت "أفضل" من خلال السماح لبيئة تشغيل JavaScript بالتعامل مع بعض من أكثر الأخطاء شيوعًا وصعبًا في عملية التطوير. لفترة طويلة ، كان لدي شكوك حول الوضع الصارم لأن Firefox فقط يدعم الوضع الصارم. ولكن اليوم ، تدعم جميع المتصفحات الرئيسية الوضع الصارم في أحدث إصداراتها (بما في ذلك IE10 و Opera12 و Android 4 ، iOS5). حان الوقت للبدء في استخدام الوضع الصارم.
ما هو الدور الذي يمكن أن يلعبه النموذج الصارم؟
يقدم نمط صارم الكثير من التغييرات على JavaScript ، وقسمتها إلى فئتين (واضحة وخفية). الهدف من التحسينات البسيطة هو إصلاح بعض المشكلات التفصيلية في JavaScript الحالية ، والتي لن أخوضها هنا ؛ إذا كنت مهتمًا ، فيرجى قراءة المستند الرائع الذي كتبه Dmitry Soshnikov ECMA-262-5 بالتفصيل الوضع الصارم. أقدم بشكل أساسي التغييرات الواضحة التي تم تقديمها بواسطة الوضع الصارم والمفاهيم التي يجب أن تعرفها قبل استخدام الوضع الصارم وتلك التغييرات التي تساعدك أكثر.
قبل البدء في تعلم ميزات محددة ، تذكر أن أحد الأهداف الرئيسية للوضع الصارم هو تمكينك من التصحيح بشكل أسرع وأكثر ملاءمة. من الأفضل إلقاء خطأ صريح عندما تكتشف بيئة وقت التشغيل مشكلة بدلاً من الفشل بصمت أو التصرف بشكل غريب (وهو ما يحدث غالبًا مع بيئات تشغيل JavaScript التي لا تدير وضعًا صارمًا). يرمي الوضع الصارم المزيد من الأخطاء ، لكن هذا شيء جيد لأن هذه الأخطاء ستجذب انتباهك وتحدد العديد من المشكلات المحتملة التي كان من الصعب تحديدها سابقًا.
إزالة مع الكلمات الرئيسية
أولاً ، تتم إزالة البيان في الوضع الصارم ، وسيقوم الرمز الذي يحتوي على البيان مع إلقاء استثناء في الوضع الصارم. لذا فإن الخطوة الأولى لاستخدام الوضع الصارم: تأكد من عدم استخدامك في الكود الخاص بك.
نسخة الكود كما يلي:
// سوف يرمي رمز JavaScript التالي خطأ في الوضع الصارم
مع (الموقع) {
تنبيه (HREF) ؛
}
منع تعيين القيم بشكل غير متوقع للمتغيرات العالمية
ثانياً ، يجب الإعلان عن المتغيرات المحلية قبل المهمة. قبل تمكين الوضع الصارم ، يتم إنشاء متغير عالمي مع نفس الاسم تلقائيًا عند النسخ للمتغير المحلي غير المعلن. هذا هو أحد الأخطاء الأكثر شيوعًا في برامج JavaScript ، وعند محاولة القيام بذلك في وضع صارم ، سيتم طرح استثناءات صريحة.
نسخة الكود كما يلي:
// سيتم طرح الاستثناء في وضع صارم
(وظيفة() {
SomeUndEclaredVar = "foo" ؛
} ()) ؛
هذا في الوظيفة لم يعد يشير إلى العالم بشكل افتراضي
تغيير مهم آخر في الوضع الصارم هو أن هذه الوظيفة التي لم يتم تعريفها أو غير محددة (فارغة أو غير محددة) لا تشير إلى البيئة العالمية افتراضيًا. سيؤدي ذلك إلى بعض أخطاء تنفيذ التعليمات البرمجية التي تعتمد على السلوك الافتراضي لهذا في الوظيفة ، على سبيل المثال:
نسخة الكود كما يلي:
Window.Color = "Red" ؛
وظيفة sexercolor () {
تنبيه (this.color) ؛
}
// سيتم الإبلاغ عن خطأ في وضع صارم. إذا لم يكن في وضع صارم ، فسيطلب منه "أحمر"
saycolor () ؛
// سيتم الإبلاغ عن خطأ في وضع صارم. إذا لم يكن في وضع صارم ، فسيطلب منه "أحمر"
saycolor.call (null) ؛
سيبقى هذا غير محدد قبل تعيينه ، مما يعني أنه عندما يتم تنفيذ مُنشئ ، سيتم طرح استثناء إذا لم يكن هناك كلمة رئيسية جديدة واضحة من قبل.
نسخة الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name ؛
}
// سيكون هناك خطأ في الوضع الصارم
var me = شخص ("نيكولاس") ؛
في الكود أعلاه ، لأنه لا يوجد جديد من قبل ، سيتم ترك هذا في الوظيفة غير محددة. نظرًا لأنه لا يمكنك تعيين خصائص لـ غير محددة ، فإن الكود أعلاه سوف يرمي خطأ. في بيئات الوضع غير الشريط ، لا يتم نسخ هذا إلى المتغير العالمي للنافذة افتراضيًا ، وستكون نتيجة التشغيل بشكل غير متوقع سمة الاسم للمتغير العالمي للنافذة.
منع إعادة تسمية
عند كتابة الكثير من التعليمات البرمجية ، يتم تعيين خصائص الكائن ومعلمات الوظائف بسهولة على اسم مكرر. الوضع الصارم سوف يرمي الأخطاء بشكل صريح في هذه الحالة
نسخة الكود كما يلي:
// أسماء المتغيرات المتكررة ستقوم بالإبلاغ عن خطأ في الوضع الصارم
وظيفة dosomething (value1 ، value2 ، value1) {
//شفرة
}
// أسماء سمات الكائنات الباهتة ستقوم بالإبلاغ عن خطأ في الوضع الصارم:
var object = {
فو: "بار" ،
فو: "باز"
} ؛
سيتم اعتبار الكود أعلاه خطأ في بناء الجملة في وضع صارم وسيسمح لك بالحصول على مطالبات قبل التنفيذ.
تقييم آمن ()
على الرغم من أن بيان eval () لم تتم إزالة في النهاية ، إلا أنه كان لا يزال يتحسن في وضع صارم. أكبر تغيير هو أن المتغيرات وإعلانات الوظائف التي تم تنفيذها في eval () لن تنشئ مباشرة متغيرات أو وظائف مقابلة في النطاق الحالي ، على سبيل المثال:
نسخة الكود كما يلي:
(وظيفة() {
eval ("var x = 10 ؛") ؛
// في الوضع غير المتخلف ، تنبيه 10
// في الوضع الصارم ، يتم طرح استثناء لأنه لم يتم تعريف x.
تنبيه (x) ؛
} ()) ؛
يتم الاحتفاظ بأي متغيرات أو وظائف تم إنشاؤها أثناء تنفيذ eval () في eval (). ولكن يمكنك الحصول على نتيجة التنفيذ بشكل صريح في تقييم () من قيمة الإرجاع لبيان eval () ، على سبيل المثال:
نسخة الكود كما يلي:
(وظيفة() {
var result = eval ("var x = 10 ، y = 20 ؛ x + y") ؛
// يمكن تشغيل العبارات المتبقية بشكل صحيح في وضع صارم أو غير مخطط. (Resulst هو 30)
تنبيه (نتيجة) ؛
} ()) ؛
رمي استثناء عند تعديل سمات القراءة فقط
يقدم ECMASCRIPT5 أيضًا القدرة على تعيين خصائص محددة لكائن إلى القراءة فقط ، أو لجعل الكائن بالكامل غير معدّل. ومع ذلك ، في الوضع غير الشريط ، فإن محاولة تعديل خاصية للقراءة فقط لن تفشل بصمت إلا بصمت. من المحتمل أن يحدث هذا لك أثناء التعامل مع بعض واجهات برمجة التطبيقات الأصلية للمتصفح. سوف يقوم الوضع الصارم بإلقاء الاستثناءات بشكل صريح في هذه الحالة ، مع تذكيرك بأن تعديل هذه الخاصية غير مسموح به.
نسخة الكود كما يلي:
var person = {} ؛
Object.DefineProperty (الشخص ، "الاسم" {
قابلة للكتابة: خطأ ،
القيمة: "نيكولاس"
}) ؛
// في الوضع غير المتخلف ، يفشل الصمت ، ويتم إلقاء استثناء في وضع صارم.
person.name = "John" ؛
في المثال أعلاه ، يتم تعيين سمة الاسم على القراءة فقط. لن يتسبب تنفيذ تعديل سمة الاسم في الوضع غير المتخلف في حدوث خطأ ، لكن التعديل لن يكون ناجحًا. لكن الوضع الصارم سوف يرمي بشكل واضح الاستثناءات.
ملاحظة: يوصى بشدة بتمكين وضع صارم عند تحديد أي سمات ECMASCRIPT.
كيف تستخدمه؟
من السهل جدًا تمكين الوضع الصارم في المتصفحات الحديثة ، فقط بحاجة إلى الظهور على الأمر التالي في رمز JavaScript
"استخدام صارم" ؛
على الرغم من أن الكود أعلاه يبدو أنه مجرد سلسلة لا تعطي متغيرًا معينًا ، إلا أنه يعني في الواقع أن محرك JavaScript يتحول إلى وضع صارم (المتصفحات التي لا تدعم الوضع الصارم ستتجاهل الكود أعلاه ولن يكون لها أي تأثير على التنفيذ اللاحق). على الرغم من أنه يمكنك تطبيق هذه التعليمات على وظيفة عالمية أو وظيفة ، إلا أننا يجب أن نذكرك بعدم تمكين الوضع الصارم في بيئة عالمية.
نسخة الكود كما يلي:
// من فضلك لا تستخدمه مثل هذا
"استخدام صارم" ؛
وظيفة dosomething () {
// سيتم تشغيل هذا الجزء من الكود في وضع صارم
}
وظيفة dosomethingelse () {
// سيتم تشغيل هذا الجزء من الكود أيضًا في وضع صارم
}
على الرغم من أن الكود أعلاه لا يبدو أنه يمثل مشكلة كبيرة. ولكن عندما لا تكون مسؤولاً عن الحفاظ على جميع التعليمات البرمجية التي تم تقديمها في الصفحة ، فإن استخدام الوضع الصارم بهذه الطريقة سيؤدي إلى وجود مشاكل ناتجة عن عدم تحضير رمز الطرف الثالث لوضع صارم.
لذلك ، من الأفضل استخدام الإرشادات التي تتيح الوضع الصارم في الوظيفة ، على سبيل المثال:
نسخة الكود كما يلي:
وظيفة dosomething () {
"استخدام صارم" ؛
// سيتم تشغيل الرمز في هذه الوظيفة في وضع صارم
}
وظيفة dosomethingelse () {
// لن يتم تشغيل الرمز في هذه الوظيفة في وضع صارم
}
إذا كنت تريد تمكين الوضع الصارم في أكثر من وظيفة واحدة ، فاستخدم تعبير الوظيفة الملقح على الفور (Iife):
نسخة الكود كما يلي:
(وظيفة() {
"استخدام صارم" ؛
وظيفة dosomething () {
// تعمل هذه الوظيفة في وضع صارم
}
وظيفة dosomethingelse () {
// تعمل هذه الوظيفة أيضًا في وضع صارم
}
} ()) ؛
ختاماً
أوصي بشدة بتمكين وضع JavaScript الصارم من الآن فصاعدًا ، والذي يمكن أن يساعدك في اكتشاف الأخطاء التي لم تلاحظها في الكود الخاص بك. لا تمكّنها في بيئة عالمية ، ولكن يمكنك استخدام Iife قدر الإمكان (تنفيذ تعبيرات الوظائف على الفور) لتطبيق أنماط صارمة على وظائف متعددة. في البداية ، ستواجه رسائل خطأ لم تصادفها من قبل ، وهو أمر طبيعي. عند تمكين الوضع الصارم ، تأكد من اختباره في المتصفحات المدعومة لاكتشاف مشكلات محتملة جديدة. لا تقم فقط بإضافة سطر "استخدم صارمًا" إلى الرمز وافترض أن الرمز المتبقي سيعمل بشكل صحيح. أخيرًا ، ابدأ في كتابة رمز أفضل في الوضع الصارم.
ملحوظة:
فيما يلي ملخص لحالات دعم الوضع الصارم لكل متصفح.
يمكنك اختبار دعم الوضع الصارم للمتصفح الحالي في هذه الصفحة.
مزايا الوضع الصارم:
جعل JavaScript أقوى
1. لم يعد هذا مغلفًا ، وتحت الوضع العادي ، كان هذا دائمًا كائنًا.
2. Fun.Caller و Fun.Arguments ليست خصائص قابلة للحذف ، ولا يمكن تعيينها أو استردادها.
3. الوسائط. Caller هي أيضًا سمة لا يمكن حذفها ، ولا يمكن تعيينها أو استردادها.
تمهد الطريق لإصدارات ecmascript في المستقبل
1. تمت إضافة الكلمات المخصصة التالية: الأدوات ، واجهة ، دع ، حزمة ، خاصة ، محمية ، عامة ، ثابتة وعائد.
2. يجب وضع إعلان الطريقة في مقدمة البرنامج النصي أو الطريقة ، ولا يمكن وضعه في منتصف العبارات مثل IF أو لـ.