در این بخش از سری آموزش جاوا اسکریپت قصد داریم در مورد م Strict Mode در جاوا اسکریپت صحبت کنیم.
جاوااسکریپت در ورژن ES5 خود Strict Mode را معرفی کرد.
استفاده از این حالت می تواند
- کیفیت کدهای برنامه نویسی جاوا اسکریپت را بهبود بخشد.
- برنامه نویس جاوا اسکریپت در این حالت آگاهانه تر کد می زند.
- پیغام های خطا واضح تر بیان می شوند از این رو پیگیری ارورها راحت تر می شود.
با استفاده از Strict Mode مجبوریم که کدهای تمیزتری بنویسیم. هر چقدر کدهای تمیزتری بنوسیم کارایی برنامه بهتر خواهد بود.
نحوه استفاده از Strict Mode
برای فعال کردن Strict Mode تنها کاری که باید انجام دهید این است که عبارت ‘use strict’
را در ابتدای کدهای خود وارد کنید.
1 2 3 4 5 |
"use strict"; // All your code goes here x = 5; // ReferenceError: x is not defined console.log(x); |
اگر میخواهید که تمام کدهایی که می زنید در حالت strict mode باشند، باید در ابتدای صفحه و قبل از تمام کدها عبارت ‘use strict’
را وارد کنید.
ولی اگر میخواهید فقط برای یک قسمت خاص از Strict Mode استفاه کنید، باید قبل از کد مورد نظرتون عبارت ‘use strict’
را قرار دهید.
1 2 3 4 5 6 7 8 9 |
x = 5; console.log(x); // 5 function sayHello() { "use strict"; str = "Hello World!"; // ReferenceError: str is not defined console.log(str); } sayHello(); |
نکته: عبارت “use strict”
فقط در ابتدای اسکریپت یا تابع قابل شناسایی توسط مرورگر است. به علاوه, مرورگرهایی که Strict Mode را پشتیبانی نمی کنند (IE9 و به پایین) به سادگی آن را نادیده و جاوا اسکریپت را در حالت بدون strict تفسیر می کنند.
محدودیت های عمومی در Strict Mode
Strict Mode هر دو رفتار زمان اجرا و سینتکس را تغییر می دهد. در بخش زیر نگاهی به محدودیت های عمومی که توسط حالت strict اجرا می شوند, می اندازیم.
متغیرهای تعریف نشده مجاز نیستند
همانطور که از قبل هم می دانید, در Strict Mode همه متغیرها باید تعریف شوند. اگر یک مقدار را به آن اختصاص بدید و از قبل تعریف نکنید یک خطای RefrenceError
ایجاد می شود
1 2 3 4 5 6 7 |
"use strict"; function doSomething() { msg = "Hi, there!"; // ReferenceError: msg is not defined return msg; } console.log(doSomething()); |
حذف یک متغیر یا تابع مجاز نیست
در Strict Mode اگر سعی در حذف یک تابع یا متغیر کنید, یک خطای سینتکس ایجاد می شود. به هر حال, حالت بدون Strict چنین تلاشی در سکوت به خطا بر می خورد و دستور delete
برابر false
می شود
1 2 3 4 |
"use strict"; var person = {name: "Peter", age: 28}; delete person; // SyntaxError |
مشابه آن اگر قصد حذف یک تابع در حالت Strict Mode داشته باشید خطای سینتکس ایجاد می شود :
1 2 3 4 5 6 |
"use strict"; function sum(a, b) { return a + b; } delete sum; // SyntaxError |
تکرار نام پارامتر مجاز نیست
در Strict Mode اگر یک تابع دو یا چند پارامتر با نام یکسان داشته باشد, یک خطای سینتکس ایجاد می شود. حالت بدون strict خطایی رخ نمی دهد.
1 2 3 4 5 6 |
"use strict"; function square(a, a) { // SyntaxError return a * a; } console.log(square(2, 2)); |
متد eval
نمی تواند محدوده (scope) را تغییر دهد
در Strict Mode برای مسایل امنیتی, کدهای پاس داده شده به eval()
نمی تواند متغیرها را تعریف/ویرایش دهد یا یک تابع در اسکوپ را تعریف کنید.
1 2 3 4 |
"use strict"; eval("var x = 5;"); console.log(x); // ReferenceError: x is not defined |
کلمات eval
و arguments
نمی توانند به عنوان شناسه استفاده شوند.
در Strict Mode , نام های eval
و arguments
مثل کلمات کلیدی در نظر گرفته می شوند بنابراین نمی توانند به عنوان نام متغیرها, توابع یا نام پارامترهای تابع و غیره.. استفاده شوند.
1 2 3 4 |
"use strict"; var eval = 10; // SyntaxError console.log(eval); |
استفاده از دستور with مجاز نیست
در Strict Mode دستور with
مجاز نیست. دستور with
خصوصیت و متدهایی شیء را به محدوده (scope) فعلی اضافه می کند.
بنابراین دستورات تو در توی داخل دستور with
می تواند خصوصیات و متد های شیء را بصورت مستقیم و بدون اشاره به آن صدا بزند.
1 2 3 4 5 6 7 8 9 10 11 |
"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; } |
رایت در خصوصیات Read-only مجاز نیست.
در Strict Mode اختصاص یک مقدار به خصوصیات ,not-writable خصوصیات get-only یا خصوصیات non-existing با خطا مواجه می شود. در حالت بدون strict این خطا در سکوت اتفاق می افتد.
1 2 3 4 5 6 |
"use strict"; var person = {name: "Peter", age: 28}; Object.defineProperty(person, "gender", {value: "male", writable: false}); person.gender = "female"; // TypeError |
افزودن خصوصیت جدید به شیء غیرقابل انعطاف مجاز نیست
در Strict Mode , تلاش برای ساخت خصوصیات جدید برور روی شیء غیرقابل انعطاف یا ناموجود باعث ایجاد خطا می شود. در حالت بدون strict این خطا در سکوت اتفاق می افتد.
1 2 3 4 5 6 7 8 |
"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 اعداد هشت هشتی (octal : اعداد با پیشوند یک صفر مثل ۰۱۰ یا ۰۳۷۷) مجاز نیستند. درحالی که همه مرورگرها در حالت بدون strict آن را پشتیبانی می کنند.
در ES6 اعداد octal با پیشوند ۰o
مثل ۰o10
, 0o377
پشتیبانی می شوند.
1 2 3 4 |
"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
و strict
.
نکته: کلمات رزرو شده, که به نام کلمات کلیدی خوانده می شوند, کلمات خاص هستند که جزء سینتکس زبان جاوا اسکریپت هستند برای مثال var
, if
, for
, function
, …
مزایای استفاده از Strict Mode
- کدها امن می شوند
- ارورها واقعی تر می شود از این رو خطایابی راحت تر می شود
- کارایی برنامه بالاتر می رود
- کدها سالم و استاندارد می شوند
- اصول کد نویسی رعایت می شود
امیدواریم در این بخش آموزش جاوا اسکریپت, از آموزش Strict Mode در جاوا اسکریپت نهایت استفاده را برده باشد.
هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق باشید.