آموزش حالت Strict Mode در جاوا اسکریپت

Ratings
(0)

 

 اکما اسکریپت 5، یک حالت strict mode دارد که باعث می شود جاوا اسکریپت بی نقص تر شود و ویژگی های ناامن کمتری داشته باشد و هشدارهای آن بیشتر شود و رفتار منطقی تری داشته باشد. به حالت نرمال(nonstrict) گاهی اوقات حالت درهم و برهم(sloppy mode) گفته می شود.


سوئیچ کردن به حالت Strict Mode در جاوا اسکریپت

با تایپ کردن عبارت زیر در اولین خط از فایل کدهای جاوا اسکریپت یا در درون عنصر <script> می توانیم به حالت strict mode سوئیچ کنیم:

'use strict';

 توجه کنید که انجین های جاوا اسکریپت، که از اکما اسکریپت 5 پشتیبانی نمی کنند، به سادگی دستور بالا را نادیده می گیرند، مانند یک عبارت دستوری؛ مقاله ی عبارت ها و دستورها در زبان جاوا اسکریپت را مشاهده کنید. ما همچنین می توانیم در تابع ها نیز به حالت strict mode سوئیچ کنیم. برای انجام این کار، به صورت زیر عمل کنید:

function foo() {
'use strict';
...
}

 این زمانی مفید است که داریم با یک قطعه کد کار می کنیم که سوئیچ کردن به حالت strict mode در همه جا، ممکن است باعث شکست در کدها شود.


حالت Strict، توصیه شده به همراه هشدارها

 تغییراتی که توسط حالت strict mode فعال می شوند، همه برای بهتر شدن کدنویسی است. بنابراین به شدت توصیه می شود که از این حالت، برای کدهای جدیدی که می نویسید استفاده کنید. و به سادگی، آن را در ابتدای فایل خود قرار دهید. اما به دو هشدار زیر توجه کنید:

1. فعال کردن حالت strict mode برای کدهای موجود، ممکن است باعث شکست در آن کد شود.

2. کد مورد نظر ممکن است به یک ویژگی تکیه کند که دیگر در دسترس نیست؛ یا اینکه ممکن است به رفتاری تکیه کند که در حالت sloppy mode نسبت به strict mode متفاوت است.

فراموش نکنید که ما این گزینه را در اختیار داریم که می توانیم توابع strict mode را در فایل هایی که در حالت عادی، یعنی sloppy mode قرار دارند، اضافه کنیم.

دقت کنید: وقتی که ما کدها را در یک فایل به یکدیگر پیوند می دهیم و یا آنها را در یک فایل خلاصه سازی(minify) می کنیم، باید مطمئن شویم که حالت strict mode در جایی که باید روشن باشد، خاموش نباشد و برعکس. هردوی این شرایط می توانند باعث شکست در کدها شوند. در بخش های زیر، با جزئیات بیشتر، به حالت strict mode می پردازیم. 


متغیرها باید در حالت Strict Mode تعریف شوند

تمام متغیرها باید در حالت strict mode تعریف شوند. این به جلوگیری از اشتباهات تایپی کمک می کند. در حالت عادی یا همان sloppy mode، انتساب دادن یک مقدار به یک متغیر تعریف نشده، یک متغیر سراسری(global) را ایجاد می کند:

function sloppyFunc() {
  sloppyVar = 123;
}
sloppyFunc(); // ایجاد شود sloppyVar باعث می شود یک متغیر به نام
console.log(sloppyVar); // 123

در حالت strict mode، انتساب یک متغیر تعریف نشده، یک خطا ایجاد می کند:

function strictFunc() {
'use strict';
strictVar = 123;
}
strictFunc(); // ReferenceError: strictVar is not defined

 


استفاده از حالت Strict Mode در توابع

حالت Strict mode برخی ویژگی های تابع را محدود می کند.

تابع ها باید در بالاترین سطح از یک میدان دید(scope) قرار داشته باشند:

در حالت strict mode، تمام توابع باید در بالاترین سطح از یک میدان دید قرار داشته باشند(میدان دید global یا مستقیماً درون یک تابع). این یعنی اینکه ما نمی توانیم تعریف یک تابع را در درون یک بلوک(به یک جفت آکولاد، بلوک گفته می شود) قرار دهیم. اگر چنین کاری انجام دهیم، با یک خطای سینتکسی(SyntaxError) مواجه خواهیم شد.

بعنوان مثال، انجین جاوا اسکریپت V8 به ما می گوید که: در حالت کدنویسی strict mode، توابع تنها باید در بالاترین سطح(میدان دید)، یا بلافاصله در داخل یک تابع تعریف شوند:

function strictFunc() {
  'use strict';
 {
  // خطای سینتکسی
     function nested() {
    }
  }
}

به هر حال، این موضوع خیلی مفید نیست.اگر می خواهید در این محدودیت، به کار خود ادامه دهید، می توانید یک تابع را در درون یک بلوک از طریق تعریف یک متغیر و یک عبارت تابعی، ایجاد کنید:

function strictFunc() {
    'use strict';
    {
      // بسیار خوب
      var nested = function () {
      };
    }
}

 


قواعد سخت گیرانه تر برای پارامترهای تابع ها

تعیین  قواعد برای پارامترهای توابع خیلی مجاز نیست، بنابراین فقط یک مورد را مثال می زنیم:

در پارامترهای یک تابع، استفاده از یک نام پارامتر تنها یک بار مجاز است و دوبار امکان پذیر نیست. زیرا آنها متغیرهای محلی هستند و نمی توانند نام یکسانی داشته باشند.


آبجکت های آرگومان ها، پروپرتی های کمتری دارند

آبجکت های آرگومان ها در حالت strict mode ساده تر هستند: در این حالت، پروپرتی های arguments.callee و arguments.caller حذف می شوند. و ما نمی توانیم آنها را در متغیرهای آرگومان ها انتساب دهیم و آرگومان ها تغییرات پارامترها را ردیابی نمی کنند. (اگر یک پارامتر تغییر کند، عنصر آرایه مربوطه به همراه آن تغییر نمی کند). ویژگی های منقضی شده آرگومان ها در صفحه 172 توضیح داده شده اند.


مقدار this در توابعی که متد نیستند، تعریف نشده(undefined) است. 

در حالت عادی یا همان sloppy mode، مقدار this در تابع هایی که متد نیستند، به آبجکت سراسری، اشاره می کند(در مرورگرها به آبجکت window اشاره می کند). برای اطلاعات بیشتر به مقاله آبجکت سراسری(Global Object) در صفحه 187 مراجعه کنید:

function sloppyFunc() {
    console.log(this === window); // true
}

 اما در حالت strict mode، مقدار this تعریف نشده(undefined) است:

function strictFunc() {
  'use strict';
  console.log(this === undefined); // true
}

 این موضوع در کانستراکتورها(constructor) مفید است. بعنوان مثال، در کانستراکتور Point در کدهای زیر، حالت strict mode فعال است:

function Point(x, y) {
  'use strict';
  this.x = x;
  this.y = y;
}

به دلیل استفاده از حالت strict mode در کدهای زیر، وقتی که ما به طور تصادفی  کلمه کلیدی new را فراموش کنیم، و به صورت یک تابع آن را فراخوانی کنیم، یک هشدار را دریافت می کنیم:

> var pt = Point(3, 1);
TypeError: Cannot set property 'x' of undefined

در حالت sloppy mode ما هیچ هشداری را مشاهده نمی کنیم، و متغیرهای سراسری x و y ایجاد می شوند. برای یادگیری نکات بیشتر در مورد اجرای کانستراکتورها به صفحه 239 مراجعه کنید. 


 تنظیم و حذف پروپرتی های تغییر ناپذیر در حالت Strict Mode با شکست مواجه می شوند، اما یک خطا ایجاد می کند

دستکاری غیرقانونی پروپرتی ها در حالت strict mode باعث ایجاد یک خطا می شود. بعنوان مثال، اگر تلاش کنیم تا مقدار یک پروپرتی read-only را تنظیم کنیم، یک خطا ایجاد می شود. یا تلاش برای حذف یک پروپرتی غیرقابل تنظیم، باعث ایجاد خطا می شود. در زیر، مثال هایی را در این زمینه مشاهده می کنید:

var str = 'abc';
function sloppyFunc() {
  str.length = 7; // تاثیری ندارد، و شکست خاموش ایجاد می کند
  console.log(str.length); // 3
}
function strictFunc() {
  'use strict';
  str.length = 7; // read-only خطا: نمی توانیم مقداری را به متغیر
  // انتساب دهیم 'length'
}

شناسه های فاقد صلاحیت، نمی توانند در حالت Strict Mode حذف شوند اما در حالت عادی(sloppy mode) ما می توانیم یک متغیر سراسری(global) foo را به صورت زیر حذف کنیم:

delete foo

 در حالت strict mode، وقتی که تلاش کنیم تا یک شناسه ی فاقد صلاحیت(unqualified identifiers) را حذف کنیم، یک خطای سینتکسی دریافت خواهیم کرد. اما هنوز می توانیم متغیرهای سراسری(global) مانند زیر را حذف کنیم:

delete window.foo; // browsers
delete global.foo; // Node.js
delete this.foo; // everywhere (in global scope)

 


متد eval() در حالت Strict Mode بی نقص تر است.

در حالت strict mode، تابع eval() کمتر غیر معمول به نظر می رسد: متغیرهای تعریف شده در رشته ارزیابی شده، دیگر به میدانِ دیدِ محیطِ اطرافِ متد eval() اضافه نمی شوند. برای جزئیات بیشتر، به مقاله ی ارزیابی کدها با استفاده از ()eval در صفحه 347 مراجعه کنید.


ویژگی هایی که در حالت Strict Mode ممنوع هستند

استفاده از دو ویژگی دیگر جاوا اسکریپت در حالت strict mode ممنوع هستند:

1. استفاده از دستور with دیگر مجاز نیست(به مقاله ی متد with در صفحه 153 مراجعه کنید). در صورت استفاده از آن، در زمان کامپایل(زمان لود شدن کدها) یک خطای سینتکسی را دریافت خواهیم کرد.

2. دیگر از اعداد اکتال(octal) استفاده نمی شود: در حالت عادی(sloppy mode) ، استفاده از یک عدد 0 (صفر) قبل از یک عدد صحیح، به صورت یک عدد اکتال در نظر گرفته می شود.  یعنی یک عدد مبنای 8 محسوب می شود. بعنوان مثال داریم:

> 010 === 8
true

در حالت strict mode، اگر از این نوع عددها استفاده کنیم، یک خطای سینتکسی دریافت می کنیم:

> function f() { 'use strict'; return 010 }
SyntaxError: Octal literals are not allowed in strict mode.

 

  • بازدید: 356

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال