حالت سختگیرانه (Strict Mode)
حالت سخت گیرانه (Strict Mode) حالتی هست که با تعریف کردن دستور "use strict" فعال میشه.
این حالت جاوااسکریپت رو موظف می کنه تا برنامه ی ما رو با سخت گیری بیشتری پردازش کنه.
وظیفه ی حالت سخت گیرانه نمایش ارورهای خاموش هست.
نکته: ارور های خاموش، ارور هایی هستند که جاوااسکریپت از آنها گذشت می کند تا برنامه را متوقف نکنند.
دستور 'use strict'
دستور "use strict" در ورژن 5 استاندارد ECMAScript به جاوااسکریپت اضافه شد. این دستور یک عبارت لیترال است و در مرورگرها یا محیط های قدیمی تر که از این استاندارد پشتیبانی نمی کنند، نادیده گرفته می شود.
نکته: لیترال به مقادیر ثابت و تحت اللفظی گفته می شود که مستقیماً در کد نوشته می شوند و نیازی به پردازش اضافی ندارند. مانند 4، true یا "PNLdev"
با فعال کردن strict mode در برنامه های خود، میتوانید کد هایی تمیز تر و قابل اعتماد تر بنویسید و از بروز خطا هایی مانند متغیرهای تعریف نشده جلوگیری کنید.
از آنجا که "use strict" تنها یک لیترال است، اگر مرورگر هایی مانند اینترنت اکسپلورر نسخه 9 آن را تشخیص ندهند، هیچ خطایی رخ نمی دهد. این ویژگی باعث می شود که بتوانید بدون نگرانی از مشکلات سازگاری با مرورگر های قدیمی، از این دستور استفاده کنید.
تعریف حالت سخت گیرانه
حالت سخت گیرانه با اضافه کردن "use strict" به ابتدای محدوده سراسری یا محدوده تابع تعریف می شود.
نکته: اگر "use strict" در ابتدای محدوده سراسری تعریف شود، تمام کد ها در حالت سخت گیرانه اجرا می شوند.
"use strict";
x = "PNLdev"; // خطا: متغیر تعریف نشده است
"use strict";
myFunc();
function myFunc() {
y = "PNLdev"; // خطا: متغیر تعریف نشده است
}
در صورتی که "use strict" را در ابتدای محدوده تابع اضافه کنیم، فقط برای کد های داخل تابع حالت سخت گیرانه فعال می شود.
x = "PNLdev"; // خطا رخ نمی دهد
myFunc();
function myFunc() {
"use strict";
y = "PNLdev"; // خطا رخ می دهد
}
نوع نوشتار 'use strict'
نوع نوشتار "use strict" برای سازگاری با نسخههای قدیمی جاوااسکریپت طراحی شده است.
در جاوااسکریپت، کامپایل شدن یک لیترال عددی (مانند 2 + 2) یا یک لیترال رشته ای (مانند "PNLdev") هیچ گونه اختلالی در اجرای برنامه ایجاد نمی کند. زیرا این لیترال ها به یک متغیر غیر موجود کامپایل می شوند و سپس از بین می روند.
بنابراین، strict mode فقط برای کامپایلر های جدیدی که این دستور را درک می کنند، اهمیت دارد.
چرا حالت سخت گیرانه؟
حالت سخت گیرانه در جاوااسکریپت به شما کمک می کند تا کد های ایمن تر و دقیق تر بنویسید.
این حالت، رفتارهای غیر مجاز یا اشتباهاتی که قبلاً در جاوااسکریپت بدون خطا اجرا می شدند را به خطاهای واقعی تبدیل می کند.
رفتارهای غیر مجاز در این حالت عبارت اند از:
- استفاده از متغیر قبل از تعریف کردن
- تغییر دادن مقدار های readonly
- حذف متغیر و توابع با delete
- پارامترهای تکراری یک تابع
- اعداد Octal
- تعریف متغیر در تابع eval
- مقدار دادن به arguments و eval
- رفتار this در توابع
استفاده از متغیر قبل از تعریف کردن
استفاده از یک متغیر، قبل از تعریف کردن آن، مجاز نیست.
"use strict";
x = "PNLdev"; // خطا: متغیر تعریف نشده است
نکته: اشیاء، نیز متغیر هستند.
استفاده از یک شیء، قبل از تعریف کردن آن، مجاز نیست.
"use strict";
person = { name: "Nima", age: 19 }; // خطا: شیء تعریف نشده است
تغییر دادن مقدار های readonly
در حالت سخت گیرانه، نمیتوان به مقدار های فقط خواندنی (readonly) مانند NaN و undefined مقدار داد.
"use strict";
NaN = "PNLdev"; // خطا: به مقدار فقط خواندنی، مقدار داده شده است
همچنین، برای تغییر دادن ویژگیهای readonly یک شیء، خطا رخ میدهد:
"use strict";
const person = {};
Object.defineProperty (person, "name", {
value: "Nima",
writable: false
});
person.name = "Ehsan"; // خطا: به ویژگی فقط خواندنی، مقدار داده شده است
نکته: در نمونه کد بالا، با استفاده از متد defineProperty از آبجکت سراسری Object، ویژگی غیرقابل تغییر را برای person.name تعریف کردیم.
حذف متغیر و توابع با delete
حذف متغیر با کلمه کلیدی delete به ما خطا میدهد.
نکته: استفاده از کلمه کلیدی delete، منسوخ شده است.
"use strict";
let x = "PNLdev";
delete x; // خطا: استفاده از کلمه کلیدی delete
برای حذف توابع با delete هم این خطا وجود دارد.
"use strict";
function myFunc() { console.log("hello, PNLdev") };
delete myFunc; // خطا: استفاده از کلمه کلیدی delete
برای حذف ویژگی های غیرقابل حذف هم خطا میگیریم.
"use strict";
delete Object.prototype; // خطا: استفاده از کلمه کلیدی delete
پارامترهای تکراری یک تابع
یک تابع نمی تواند پارامترهایی با اسم تکراری داشته باشد.
"use strict";
function myFunc(x, x) {}; // خطا: پارامتر تکراری
اعداد Octal
اگر عدد صفر در ابتدای اعداد نوشته شود (010)، جاوااسکریپت آن را به عنوان یک عدد اکتال در نظر می گیرد.
let x = 010 // 8
در حالت سخت گیرانه اجازه نوشتن صفر، قبل از یک عدد (پایه ۱۰) رو نداریم:
"use strict";
let x = 010; // خطا: لیترال اکتال در حالت سخت گیرانه مجاز نیست
کاراکتر فرار اکتال نیز مجاز نیست.
"use strict";
let x = "\010"; // خطا: لیترال اکتال در حالت سخت گیرانه مجاز نیست
تعریف متغیر در تابع eval()
به دلالیل امنیتی، تابع eval() مجاز به تعریف متغیر در محدوده ای که در آن فراخوانی شده است، نیست.
"use strict";
eval ("x = 4");
alert (x); // خطا: متغیر در eval تعریف نشده است
"use strict";
eval ("var x = 4");
alert (x); // خطا: متغیر در eval تعریف نشده است
"use strict";
eval ("let x = 4");
alert (x); // خطا: متغیر در eval تعریف نشده است
مقدار دادن به arguments و eval
از کلمه eval نمی توان به عنوان نام یک متغیر استفاده کرد.
"use strict";
let eval = "PNLdev";
از کلمه arguments نمی توان به عنوان نام یک متغیر استفاده کرد.
"use strict";
let arguments = "PNLdev";
رفتار this در توابع
در حالت عادی، کلمه کلیدی this در یک تابع به شیء فراخوانی کننده اشاره می کند. اما اگر شیء مشخصی وجود نداشته باشد، this به شیء سراسری (در مرورگرها window) اشاره می کند.
در حالت سخت گیرانه، رفتار this تغییر می کند. به این شکل که اگر شیء مشخصی وجود نداشته باشد، this به جای شیء سراسری، مقدار undefined را بر می گرداند.
"use strict";
function myFunc() {
document.getElementById("demo").innerHTML = this;
}
myFunc();
خلاصه درس