ما هو "use strict" في JavaScript ولماذا يختلف عليه؟
\n\nهل سبق لك أن كتبت كود JavaScript يعمل "بطريقة غريبة"؟ متغير يعلن نفسه بنفسه، this يشير إلى الكائن العام بدلاً من ما كنت تتوقعه، والخطأ يُبتلع بصمت؟ مرحبًا بك في عالم JS "القذر".
التوجيه "use strict" ليس دالة ولا عامل تشغيل. إنه حرفيًا مفتاح تبديل الوضع لسكريبتك أو دالتك. عندما تكتب "use strict" في بداية ملف أو دالة، فأنت تقول لمحرك JavaScript: "مرحبًا، لا تسامحني على أخطائي. كن أكثر صرامة، ولكن أكثر صدقًا".
هذا الموضوع هو أحد أكثر الأسئلة شيوعًا على Stack Overflow (آلاف المشاهدات). دعنا نفهم بالضبط ما يفعله الوضع الصارم، ولماذا تم اختراعه، وكيف يمكنك استخدامه لتجنب إطلاق النار على قدمك.
\n\nكيف يتم تفعيل الوضع الصارم؟
\n\nطريقتان فقط:
\n\n- \n
- عالميًا (للسكريبت بأكمله):
"use strict";في السطر الأول من الملف. \n - محليًا (لدالة):
"use strict";في السطر الأول من جسم الدالة. \n
// الوضع الصارم العالمي\n"use strict";\nlet x = 10;\n\n// الوضع الصارم المحلي\nfunction myFunc() {\n "use strict";\n let y = 20;\n}\n\nهام: إذا قمت بخلط كود صارم وغير صارم في ملف واحد (على سبيل المثال، بدمج السكريبتات)، فقد تنشأ مشاكل. من الأفضل استخدام الوضع الصارم للدوال الفردية أو الوحدات (وحدات ES6 تكون تلقائيًا في الوضع الصارم).
\n\nأهم 5 أخطاء يمنعها "use strict"
\n\nالهدف الرئيسي لـ "use strict" هو تحويل أخطاء JavaScript "الصامتة" إلى استثناءات واضحة (أخطاء يتم طرحها ويمكن التقاطها). إليك 5 حالات الأكثر شيوعًا.
1. منع الإنشاء الضمني للمتغيرات العامة
\n\nهذا كلاسيكي. في الوضع العادي، إذا نسيت كتابة var أو let أو const، يصبح المتغير تلقائيًا عامًا. هذا يمكن أن يؤدي إلى أخطاء يصعب اكتشافها.
// بدون "use strict"\nfunction sum(a, b) {\n total = a + b; // خطأ؟ لا. total أصبح متغيرًا عامًا!\n}\nsum(2, 3);\nconsole.log(total); // 5 — يعمل، لكن هذا فظيع.\n\n// مع "use strict"\n"use strict";\nfunction sumStrict(a, b) {\n total = a + b; // ReferenceError: total is not defined\n}\nsumStrict(2, 3); // خطأ! الكود سينهار فورًا.\n\nكيف تتجنب ذلك؟ قم دائمًا بتعريف المتغيرات. استخدم let و const بدلاً من var لتجنب الرفع والمتغيرات العامة العرضية.
2. تعيين قيمة لخصائص غير قابلة للكتابة
\n\nفي الوضع العادي، يتجاهل JavaScript بصمت محاولة تغيير NaN أو undefined أو كائن مجمد. في الوضع الصارم، سيظهر خطأ.
"use strict";\n\n// محاولة إعادة كتابة NaN\nNaN = 123; // TypeError: Cannot assign to read only property 'NaN'\n\n// محاولة تغيير كائن مجمد\nconst obj = Object.freeze({name: "Alice"});\nobj.name = "Bob"; // TypeError: Cannot assign to read only property 'name'\n\nكيف تتجنب ذلك؟ لا تحاول إعادة تعريف الثوابت المضمنة. استخدم Object.freeze() بوعي.
3. حذف المتغيرات والدوال والوسائط
\n\nلا يمكنك حذف متغير تم تعريفه عبر var أو let، أو حذف دالة. في الوضع العادي، يتم تجاهل هذا ببساطة.
"use strict";\n\nvar x = 10;\ndelete x; // SyntaxError: Delete of an unqualified identifier in strict mode.\n\nfunction foo() {}\ndelete foo; // SyntaxError\n\nكيف تتجنب ذلك؟ لا تستخدم delete للمتغيرات. هو مطلوب فقط لحذف خصائص الكائنات: delete obj.prop.