به نام خدا با عرض سلام و احترام خدمت شما دوستان عزیز. در ادامه آموزش جاوا اسکریت این جلسه قصد داریم به مبحث Strict Mode در جاوا اسکریپت بپردازیم.با ما همراه باشید.
Strict Mode چیست؟
Strict Mode در ECMAScript 5 (ES5) معرفی شد.حالت strict mode در واقع حالتی است که در آن کدها با شرایط سخت گیرانه تری اجرا می شوند.به عنوان مثال، در حالت non-strict mode، اگر متغیری را بدون اعلام آن با استفاده از کلمه کلیدی var
(مثلاً ;x = 5
) مقداردهی اولیه کنید، مفسر جاوا اسکریپت فرض میکند که به یک متغیر سراسری اشاره میکنید و اگر چنین متغیری وجود نداشته باشد،به طور خودکار یکی را ایجاد می کند.
همچنین، ویژگیهایی که منسوخ شدهاند نیز ممکن است در حالت Strict Mode خطا ایجاد کنند. از این رو، حالت Strict Mode باگها را کاهش و امنیت و عملکرد کلی برنامه شما را بهبود میبخشد.
فعال کردن حالت Strict Mode
همانطور که در مثال زیر نشان داده شده است، برای فعال کردن حالت Strict Mode کافی است رشته "use strict"
را در ابتدای اسکریپت خود اضافه کنید:
"use strict"; // All your code goes here x = 5; // ReferenceError: x is not defined console.log(x);
اگر دستور "use strict"
را به عنوان خط اول برنامه جاوا اسکریپت خود اضافه کنید، حالت Strict Mode برای کل اسکریپت اعمال می شود. اما، شما همچنین می توانید حالت Strict Mode را فقط برای یک تابع فعال نمایید.به عنوان مثال:
x = 5; console.log(x); // 5 function sayHello() { "use strict"; str = "Hello World!"; // ReferenceError: str is not defined console.log(str); } sayHello();
توجه: دستورالعمل "use strict"
فقط در ابتدای یک اسکریپت یا یک تابع شناخته می شود.همه مرورگرهای مدرن از دستورالعمل "use strict"
پشتیبانی می کنند به جز اینترنت اکسپلورر 9 و نسخه های پایین تر.بعلاوه، مرورگرهایی که از دستورالعمل "use strict"
پشتیبانی نمی کنند، بی سر و صدا آن را نادیده می گیرند و جاوا اسکریپت را در حالت non-strict mode پارس می کنند.
محدودیت های عمومی در Strict Mode
حالت Strict Mode، هم سینتکس و هم رفتار زمان اجرا را تغییر می دهد. در بخشهای بعدی، به محدودیتهای کلی که در حالت Strict Mode اعمال میشوند، نگاهی می اندازیم:
متغیرهای اعلان نشده مجاز نیستند
همانطور که می دانید، در حالت Strict Mode، همه متغیرها باید اعلان شوند. اگر مقداری را به یک شناسه اعلان نشده اختصاص دهید، یک ReferenceError رخ خواهد داد.
"use strict"; function doSomething() { msg = "Hi, there!"; // ReferenceError: msg is not defined return msg; } console.log(doSomething());
حذف یک متغیر یا یک تابع مجاز نیست
در حالت Strict Mode، اگر بخواهید یک متغیر یا یک تابع را حذف کنید، یک خطای نحوی ایجاد می شود. در صورتی که در حالت non-strict mode عبارت به صورت غلط ارزیابی میشود.
"use strict"; var person = {name: "Peter", age: 28}; delete person; // SyntaxError
به طور مشابه، هنگامی که سعی می کنید یک تابع را در حالت Strict Mode حذف کنید، یک خطای نحوی دریافت خواهید کرد:
"use strict"; function sum(a, b) { return a + b; } delete sum; // SyntaxError
پارامتر هایی با نام یکسان مجاز نمی باشد
در حالت Strict Mode ، اگر یک اعلان تابع دارای دو یا چند پارامتر با نام یکسان باشد، یک خطای نحوی ایجاد می شود. ولی در حالت non-strict mode هیچ خطایی رخ نمی دهد.
"use strict"; function square(a, a) { // SyntaxError return a * a; } console.log(square(2, 2));
متد eval نمی تواند دامنه را تغییر دهد
در حالت Strict Mode، به دلایل امنیتی، کد ارسال شده به ()eval
نمی تواند متغیرها را اعلان/تغییر دهد یا توابع را در محدوده اطراف تعریف نماید. درصورتی در حالت non-strict mode می تواند.
"use strict"; eval("var x = 5;"); console.log(x); // ReferenceError: x is not defined
eval و آرگومان ها نمی توانند به عنوان شناسه استفاده شوند
در حالت Strict Mode، با نامهای eval
و arguments
مانند کلمات کلیدی رفتار میشود، بنابراین نمیتوان از آنها به عنوان نام متغیرها، نام توابع، یا به عنوان نام پارامترهای تابع و غیره استفاده کرد.
"use strict"; var eval = 10; // SyntaxError console.log(eval);
استیتمنت with مجاز نمیباشد
در حالت Strict Mode، دستور with
مجاز نیست.دستور with
پراپرتی ها و متد های ابجکت را به محدوده فعلی اضافه می کند.بنابراین، دستورات تو در تو در داخل دستور with
میتوانند خصوصیات و متدهای ابجکت را مستقیماً بدون ارجاع به آن فراخوانی کنند.
"use strict"; // Without with statement var radius1 = 5; var area1 = Math.PI * radius1 * radius1; // Using with statement var radius2 = 5; with(Math) { // SyntaxError var area2 = PI * radius2 * radius2; }
افزودن یک ویژگی جدید به یک شی غیر قابل توسعه مجاز نیست
در حالت Strict Mode، تلاش برای ایجاد ویژگی های جدید بر روی اشیاء غیر قابل گسترش یا غیر موجود نیز با خطا مواجه می شود.
"use strict"; var person = {name: "Peter", age: 28}; console.log(Object.isExtensible(person)); // true Object.freeze(person); // lock down the person object console.log(Object.isExtensible(person)); // false person.gender = "male"; // TypeError
اعداد اکتال مجاز نیستند
در حالت Strict Mode، اعداد اکتال (اعداد با پیشوند صفر به عنوان مثال 010، 0377) مجاز نیستند.اگرچه، در همه مرورگرها در حالت non-strict mode پشتیبانی می شودبا این حال، در ES6 اعداد اکتالی با پیشوند یک عدد با 0o
پشتیبانی می شوند، یعنی 0o10، 0o377 و ….
"use strict"; var x = 010; // SyntaxError console.log(parseInt(x));
در مثالهای بالا میتوانید به وضوح ببینید که چگونه حالت Strict Mode میتواند به شما در جلوگیری از اشتباهات رایجی که اغلب هنگام نوشتن یک برنامه جاوا اسکریپت مورد توجه قرار نمیگیرند، کمک کند.
کلمات کلیدی رزرو شده برای آینده مجاز نیستند
همانطور که قبلاً از فصل های قبلی می دانید، کلمات که رزرو می باشند را نمی توان به عنوان شناسه (نام متغیرها، نام توابع و برچسب های حلقه) در یک برنامه جاوا اسکریپت استفاده کرد. علاوه بر این حالت Strict Mode محدودیت هایی را برای استفاده از آن دسته از کلمات کلیدی که برای آینده رزرو میباشند نیز اعمال می کند.
طبق آخرین استانداردهای ECMAScript 6 (یا ES6)، این کلمات کلیدی زمانی که در کد حالت Strict Mode یافت می شوند، کلمات کلیدی رزرو شده هستند: await
, implements
, interface
, package
, private
, protected
, public
, and static
. با این حال، برای سازگاری بهینه، باید از استفاده از کلمات کلیدی رزرو شده به عنوان نام متغیر یا نام تابع در برنامه خود اجتناب کنید.
نکته: کلمات رزرو شده که به آنها کلمات کلیدی نیز گفته می شود، کلمات خاصی هستند که بخشی از نحو زبان جاوا اسکریپت هستند، برای مثال var، if، for، function و … برای فهرست کامل همه کلمات رزرو شده به مرجع کلیدواژه های رزرو شده JS مراجعه کنید.
دیدگاهتان را بنویسید