دیدیم که js در مورد چیزها خیلی لیبرال و انعطاف پذیر است. روشی وجود دارد تا به موتور js بگوییم که میخواهیم کدها رار سختگیرانه تر بررسی کند. strict mode میتواند به ما در جلوگیری از خطا در یک سری شرایط خاص کمک کند. فرض کنید متغیری را تعریف کرده ایم ولی موقع مقداردهی در تایپ اشتباه میکنیم:
var person;
persom = { };
console.log(persom);
خروجی کد بالا Object() است. این شیء به global object یا همان window اضافه شده. متغیر person هم همین طور. اگر در کنسول بنویسیم window.person مقدار undefined را برمیگرداند. این مسئله میتواند باعث مشکلات زیادی شود. js یک ویژگی دارد. میتوانیم به js بگوییم تا سختگیرتر باشد و قانون های بیشتری را پیاده سازی کند. برای این کار به اول کد خط زیر را اضافه میکنیم:
"use strict";
یکی از پرکاربردترین مفاهیم در strict mode این است که حتما باید اول متغیر با var تعریف شود و بعد تنظیم شود. در این حالت اگر از کد اجرا بگیریم خطا میدهد:
persom is not defined
عبارت "use strict" باید بالای همه خط کدها یا بالای یک تابع قرار بگیرد، چوان میتوانی فقط یک تابع را strict کنیم. بخصوص یک execution context جدید میتواند از strict mode استفاده کند، نه بقیه فایل و global execution context.
function logNewPerson() {
"use strict";
var person2;
persom2 = { };
console.log(persom2);
}
var person;
persom = { };
console.log(persom);
logNewPerson();
با اجرای کد بالا میشود:
Object { }
Uncaught ReferenceError: persom2 is not defined
یعنی قسمت global چون strict نبوده مشکلی نداشته. شاید این سوال پیش بیاید که چرا همیشه از اول از strict mode استفاده نکردیم. چونا این یک ویژگی اضافی است و همه موتورهای js این ویژگی را مثل هم پیاده سازی نکرده اند. پس این چیزی نیست که بتوانیم ۱۰۰٪ به آن متکی باشیم. اگر چند فایل js داشته باشیم و بخواهیم آنها را یکی و minify کنیم تا فقط یک بار دانلود شود، اگر فایل اول از "use strict"; استفاده کرده باشد، روی همه کدها اعمال میشود و اگر همه فایل های دیگر js قوانین strict را رعایت نکرده باشند به مشکل میخوریم.
در سایت mozilla developer network در قسمت strict mode درباره چگونگی پیاده سازی strict mode در firefox توضیح داده شده.