الوضع الصارم (Strict Mode) في JavaScript: لازم تكون عارفه!
يا هلا بالشباب! اليوم بنتكلم عن ميزة مهمة في JavaScript اسمها الوضع الصارم أو Strict Mode. هذي الميزة مو بس بتخلي كودك أنظف وأقل مشاكل، بل بتساعدك كمان تتجنب أخطاء ممكن تتعبك بعدين.
وش هو الوضع الصارم وليش نحتاجه؟
ببساطة، الوضع الصارم هو طريقة لتفعيل مجموعة من القواعد المشددة على كود JavaScript حقك. لما تفعّله، JavaScript بتصير "أكثر صرامة" في التعامل مع الأخطاء اللي كانت تتجاهلها أو تحاول تصلحها بطرق غريبة في الوضع العادي (اللي يسمونه "sloppy mode").
ملاحظة: الهدف الرئيسي من الوضع الصارم هو كشف الأخطاء الشائعة اللي ممكن تسويها بدون ما تدري، ومنعك من القيام بأشياء تعتبر "غير آمنة" أو ممكن تسبب مشاكل في الأداء. كمان بيخلي محركات JavaScript تشتغل بشكل أفضل مع كودك.
كيف نفعّل الوضع الصارم؟
تفعيله سهل جداً، عندك طريقتين:
1. تفعيله على مستوى الملف كله (Global)
إذا حطيت العبارة "use strict" في أول سطر في ملف JavaScript حقك، كذا تكون فعلت الوضع الصارم على كل الكود اللي في الملف.
"use strict";
const x = 10; // هذا مسموح
y = 20; // هذا بيعطيك خطأ: y is not defined (لأنها global ضمني)
function doSomething() {
// ...
}
2. تفعيله داخل دالة معينة (Local)
لو حبيت تفعّل الوضع الصارم بس لجزء معين من الكود، تقدر تحط "use strict" في أول سطر داخل دالة. كذا، بس الكود اللي داخل هذي الدالة هو اللي بيكون تحت الوضع الصارم.
const x = 10; // هنا الوضع العادي (Sloppy Mode)
function doSomethingStrict() {
"use strict";
let y = 20; // هذا مسموح
z = 30; // هذا بيعطيك خطأ: z is not defined (داخل الدالة الصارمة)
}
function doSomethingElse() {
// هنا الوضع العادي مرة ثانية
a = 40; // هذا مسموح (بيصير global ضمني)
}
نصيحة: الأفضل دائماً إنك تفعل الوضع الصارم على مستوى الملف بالكامل، خصوصاً في المشاريع الجديدة. كذا تضمن إن كل الكود حقك يتبع نفس القواعد الصارمة من البداية. وتجنب تفعيله "Global" في ملفات كبيرة قديمة ممكن تكسر لك أشياء فيها.
وش يمنع الوضع الصارم؟ (أهم التغييرات)
هنا بنستعرض أهم الأشياء اللي يمنعها أو يغيرها الوضع الصارم، واللي بتخلي كودك أفضل وأقل أخطاء:
1. منع المتغيرات الشاملة الضمنية (Implicit Global Variables)
في الوضع العادي، لو نسيت تعرف متغير بـ var أو let أو const، JavaScript بتخليه متغير شامل (global). الوضع الصارم بيمنع هالشيء ويعطيك خطأ.
"use strict";
// good = 10; // Error: good is not defined
let good = 10; // OK
2. منع تعيين قيم لخصائص للقراءة فقط (Read-Only Properties)
ما تقدر تغير قيمة خاصية للقراءة فقط أو خاصية غير قابلة للكتابة. في الوضع العادي، ممكن يتجاهل هالشيء بصمت، لكن في الوضع الصارم بيعطيك خطأ.
"use strict";
const obj = {};
Object.defineProperty(obj, "x", { value: 10, writable: false });
// obj.x = 20; // Error: Cannot assign to read only property 'x'
3. منع حذف الخصائص غير القابلة للحذف (Undeletable Properties)
ما تقدر تحذف خصائص ما ينفع تنحذف (مثل Object.prototype). في الوضع العادي، ممكن ما يصير شيء، لكن في الوضع الصارم بيعطيك خطأ.
"use strict";
// delete Object.prototype; // Error: Cannot delete property 'prototype' of function Object() { [native code] }
4. منع أسماء المعاملات المكررة (Duplicate Parameter Names)
في الوضع العادي، تقدر تحط نفس اسم المعامل أكثر من مرة في تعريف الدالة (وهذا شيء غريب وممكن يسبب لخبطة). الوضع الصارم بيمنع هالشيء تماماً.
"use strict";
// function sum(a, b, a) { // Error: Duplicate parameter name not allowed in this context
// return a + b;
// }
5. قيمة this في الدوال
في الوضع العادي، لو استدعيت دالة عادية (مو method في object) وكانت this فيها غير محددة، JavaScript بتخلي this تشير إلى الكائن الشامل (global object) اللي هو window في المتصفح أو global في Node.js. في الوضع الصارم، this بتكون undefined، وهذا أفضل عشان تتجنب مشاكل جانبية.
"use strict";
function showThis() {
console.log(this);
}
showThis(); // undefined (في الوضع الصارم)
// في الوضع العادي كانت بتكون window أو global
6. منع استخدام الكلمات المحجوزة المستقبلية (Future Reserved Keywords)
في الوضع الصارم، ما تقدر تستخدم كلمات ممكن تكون محجوزة مستقبلاً في JavaScript كـ أسماء لمتغيراتك أو دوالك (مثل implements, interface, let, package, private, protected, public, static, yield).
"use strict";
// var public = 10; // Error: Unexpected strict mode reserved word
7. منع arguments.caller و arguments.callee
هذي الخصائص كانت تسمح لك بالوصول للدالة اللي استدعت الدالة الحالية أو الدالة نفسها. هي ميزات قديمة وتعتبر غير آمنة وممكن تأثر على الأداء، لذلك تم منعها في الوضع الصارم.
"use strict";
function restrictedFunction() {
// console.log(restrictedFunction.caller); // Error: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
// console.log(arguments.callee); // Error: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
}
restrictedFunction();
الخلاصة
الوضع الصارم في JavaScript هو صديقك المبرمج. بيساعدك تكتب كود أفضل، أقل أخطاء، وأسهل في الصيانة. عوّد نفسك على استخدامه خصوصاً في مشاريعك الجديدة. صحيح ممكن تواجه بعض الأخطاء في البداية، لكن هذي الأخطاء بتكون دليل لك عشان تصلح ممارسات برمجية مو صحيحة وتتعلم تكتب كود أكثر احترافية.
يلا، فعل "use strict" وخلي كودك يتكلم عن نفسه!