"use strict" في JavaScript: هل ينقذ من الأخطاء؟ تحليل كامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو "use strict" في JavaScript ولماذا يختلف عليه؟

\n\n

هل سبق لك أن كتبت كود JavaScript يعمل "بطريقة غريبة"؟ متغير يعلن نفسه بنفسه، this يشير إلى الكائن العام بدلاً من ما كنت تتوقعه، والخطأ يُبتلع بصمت؟ مرحبًا بك في عالم JS "القذر".

\n\n

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

\n\n

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

\n\n

كيف يتم تفعيل الوضع الصارم؟

\n\n

طريقتان فقط:

\n\n
    \n
  • عالميًا (للسكريبت بأكمله): "use strict"; في السطر الأول من الملف.
  • \n
  • محليًا (لدالة): "use strict"; في السطر الأول من جسم الدالة.
  • \n
\n\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 حالات الأكثر شيوعًا.

\n\n

1. منع الإنشاء الضمني للمتغيرات العامة

\n\n

هذا كلاسيكي. في الوضع العادي، إذا نسيت كتابة var أو let أو const، يصبح المتغير تلقائيًا عامًا. هذا يمكن أن يؤدي إلى أخطاء يصعب اكتشافها.

\n\n
// بدون "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 لتجنب الرفع والمتغيرات العامة العرضية.

\n\n

2. تعيين قيمة لخصائص غير قابلة للكتابة

\n\n

في الوضع العادي، يتجاهل JavaScript بصمت محاولة تغيير NaN أو undefined أو كائن مجمد. في الوضع الصارم، سيظهر خطأ.

\n\n
"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() بوعي.

\n\n

3. حذف المتغيرات والدوال والوسائط

\n\n

لا يمكنك حذف متغير تم تعريفه عبر var أو let، أو حذف دالة. في الوضع العادي، يتم تجاهل هذا ببساطة.

\n\n
"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.

\n\n

4. تكرار معاملات الدالة

المدونات

توصيات الكتب