الـ Strict Mode في JavaScript — دليلك الكامل
مقدمة — ليه أصلاً في حاجة اسمها Strict Mode؟
لما JavaScript اتعملت في الأول، كانت فيها قرارات تصميم كتير "مرنة" — يعني بتسمح بأخطاء من غير ما تقولك عليها. مع الوقت، المطورين لقوا إن الكود بيبقى صعب الفهم وفيه bugs مخفية.
علشان كده في ES5 (سنة 2009) اتضافت ميزة اسمها Strict Mode — وهي باختصار: بتخلي JavaScript أكثر صرامة في التعامل مع الكود بتاعك وبتعرّفك على الأخطاء بدل ما تتجاهلها.
إزاي تشغّل Strict Mode؟
بكل بساطة بتحط السطر ده في أول الملف أو أول الـ function:
"use strict";
مثال على مستوى الملف كله:
"use strict";
x = 10; // ❌ هيطلع Error — لأن x مش معرّفةمثال على مستوى function بس:
function myFunc() {
"use strict";
y = 5; // ❌ Error جوه الـ function بس
}
z = 99; // ✅ هنا عادي، لأن strict mode مش شغّال برّاملاحظة مهمة: لو بتستخدم ES Modules أو React أو TypeScript — الـ Strict Mode بيتشغل تلقائياً من غير ما تكتب حاجة.
الـ Strict Mode بيعمل إيه بالظبط؟ (مع أمثلة)
1. 🚫 مش هتقدر تستخدم متغير من غير ما تعرّفه
من غير strict mode، لو نسيت تكتب let أو const أو var، JavaScript بتعمل المتغير بصمت كـ global variable — وده من أخطر الأخطاء.
// بدون strict mode ❌
name = "Ahmed"; // اتعمل global variable من غير ما تحس
console.log(name); // "Ahmed" — مفيش error!"use strict";
name = "Ahmed"; // ✅ هنا هيطلع ReferenceError فوراًليه ده مهم؟ لأن المتغيرات الـ global بتأثر على كل الكود وبتعمل مشاكل صعبة الـ debug.
مش هتقدر تمسح متغير أو function بـ delete:
"use strict";
let car = "BMW";
delete car; // ❌ SyntaxError
function greet() {}
delete greet; // ❌ SyntaxErrorبدون strict mode، الـ delete على المتغيرات كان بيفشل بصمت من غير ما يقولك بإيه — وده مربك جداً.
مش هتقدر تكرر اسم Parameter في الـ Function:
// بدون strict mode — بيشتغل! وده bug
function add(a, a) {
return a + a; // أي `a` هيستخدم؟ 🤔
}"use strict";
function add(a, a) { // ❌ SyntaxError فوراً
return a + a;
}
مش هتقدر تستخدم keywords محجوزة للمستقبل
JavaScript عندها كلمات محجوزة للـ versions الجاية زي:
implements, interface, let, package, private, protected, public, static, yield
"use strict";
let private = 10; // ❌ SyntaxError — private كلمة محجوزة
الـ this بيتصرف بشكل مختلف جوه الـ Functions:
ده من أهم الفروق وكمان من أكثرها إرباكاً للمبتدئين.
// بدون strict mode
function showThis() {
console.log(this); // بيطبع الـ window object كامل!
}
showThis();"use strict";
function showThis() {
console.log(this); // بيطبع undefined
}
showThis();ليه ده أحسن؟ لأن لما بتاخد function وبتستخدمها كـ callback أو بتبعتها لمكان تاني، الـ this ميبقاش بيعمل مشاكل لأنه undefined بدل ما يبقى الـ window ويعدّل فيه بدون قصد.
مش هتقدر تكتب على property بتاعها writable: false:
"use strict";
const obj = {};
Object.defineProperty(obj, "name", { value: "Ali", writable: false });
obj.name = "Mohamed"; // ❌ TypeError — مش مسموح تعدّلبدون strict mode، السطر ده كان بيتجاهل من غير أي error — وانت مش عارف ليه القيمة مش بتتغير!

امتى تستخدم Strict Mode؟
الإجابة البسيطة: دايماً! ✅
لو بتكتب كود JavaScript عادي → حط "use strict" في أول الملف
لو بتستخدم React / Vue / Angular → هو شغّال تلقائياً
لو بتستخدم ES Modules (import/export) → هو شغّال تلقائياً
لو بتستخدم TypeScript → هو شغّال تلقائياً
خلاصة
الـ Strict Mode مش بس "ميزة إضافية" — هو طريقة تفكير. هو بيقولك:
“أنا مش هسيبك تعمل غلطات بالصدفة وتتعب في الـ debug بعدين.”
كل bug بيطلع وانت بتكود أحسن من bug بتلاقيه وانت في الـ production. الـ Strict Mode هو الشبكة الأمان بتاعتك في JavaScript