ال Strict Mode وضع في JavaScript بيغير بعض القواعد علشان أخطاء كانت ممكن تعدي بصمت تبقى أوضح لكنه مش نظام حماية شامل ومش ضمان إن منطق البرنامج صحيح هنشوف إمتى بيتفعل وإزاي بيأثر على أمثلة صغيرة

طريقة تشغيله في ملف عادي

اكتب "use strict" في بداية ملف Script عادي قبل التعليمات التنفيذية ينفع يكون قبله تعليق أو مسافات وتقدر تشغله داخل دالة بشروط هنوضحها كمان شوية

"use strict";

const course = "JavaScript";
console.log(course);
JavaScript

ال Modules شغالة بالوضع الصارم تلقائيا

لو الملف بيتحمل ك ES Module مش محتاج تضيف التعليمة علشان تفعيل الوضع الصارم وكذلك جسم ال Class بيخضع لقواعده وجود الكلمة مش شرط في كل ملف JavaScript حديث

<script type="module" src="app.js"></script>

أمثلة المقارنة مع الوضع العادي لازم تتجرب في Script عادي أو سياق واضح لأن تشغيلها جوه Module أو أداة بتحول الكود ممكن يغير النتيجة المتوقعة شغل الأمثلة المستقلة كل واحد لوحده

الإسناد لمتغير غير معلن

في الوضع الصارم الإسناد لاسم مش معلن بيرمي ReferenceError بدل إنشاء خاصية عامة بالخطأ المثال التالي مقصود يفشل والحل هو التصريح عن المتغير

"use strict";
totalPrice = 100;
ReferenceError
"use strict";
let totalPrice = 100;
console.log(totalPrice);
100

محاولة الكتابة في خاصية غير قابلة للكتابة

هنعرف خاصية بقيمة ثابتة ونجرب نغيرها الوضع الصارم هيحول المحاولة إلى TypeError المثال بيطبع اسم الخطأ بدل الاعتماد على صياغة الرسالة اللي ممكن تختلف بين المحركات

"use strict";
const settings = {};
Object.defineProperty(settings, "limit", {
  value: 5,
  writable: false
});

try {
  settings.limit = 10;
} catch (error) {
  console.log(error.name);
}
console.log(settings.limit);
TypeError
5

قيمة this في استدعاء دالة عادية

في دالة صارمة مستدعاة مباشرة من غير كائن ال this بتكون undefined بدل تحويلها للكائن العام المثال عن دالة عادية مش Arrow Function لأن الأسهم بتاخد this من السياق المحيط

function showContext() {
  "use strict";
  return this;
}

console.log(showContext() === undefined);
true

حذف اسم متغير مختلف عن حذف خاصية

ال delete مخصصة لحذف خصائص الكائنات مش مسح متغير معلن كتابة delete مع اسم متغير مباشر في الوضع الصارم خطأ نحوي أما حذف خاصية قابلة للحذف فمسموح

"use strict";
const user = { name: "Mona", temporary: true };
delete user.temporary;
console.log("temporary" in user);
false
"use strict";
let score = 10;
delete score;
SyntaxError

قواعد بتظهر وقت قراءة الكود

من الأمثلة المرفوضة في الوضع الصارم تكرار أسماء معاملات الدالة وكتابة الصيغة الثمانية القديمة زي 010 لو عاوز رقم بالنظام الثماني استخدم الصيغة الصريحة 0o10

الأخطاء النحوية بتمنع تحليل الكود قبل تنفيذه فمتجمعش مثال مقصود يفشل مع باقي أمثلة المقال في نفس الملف

"use strict";
console.log(0o10);
8

انتبه لمكان التعليمة مع المعاملات الافتراضية

مينفعش تكتب تعليمة use strict داخل دالة قائمة معاملاتها فيها قيمة افتراضية أو Rest Parameter أو Destructuring شغل الوضع على مستوى الملف أو استخدم Module بدل وضع التعليمة داخل الدالة نفسها

function greet(name = "Guest") {
  "use strict";
  return "Hello " + name;
}
SyntaxError
"use strict";

function greet(name = "Guest") {
  return "Hello " + name;
}

console.log(greet());
Hello Guest

الوضع الصارم مش بديل للاختبارات

ممكن تكتب معادلة غلط أو تنسى التحقق من صلاحية مستخدم والكود يكون Strict من غير مشكلة علشان كده استخدم الاختبارات وأدوات الفحص ومراجعة المدخلات بجانب قواعد اللغة

لو بتعدل مشروع قديم فعل الوضع على جزء مفهوم وجرب سلوكه قبل تعميمه أما في مشروع ES Modules فابدأ من معرفة إنه متفعل بالفعل وركز على الأخطاء اللي بيكشفها

مصادر للتوسع