JavaScript 严格模式

"use strict"; 定义 JavaScript 代码应该以“严格模式”执行。

"use strict" 指令

"use strict" 是 JavaScript 1.8.5 中的新指令(ECMAScript version 5)。

它不算一条语句,而是一段文字表达式,更早版本的 JavaScript 会忽略它。

"use strict"; 的作用是指示 JavaScript 代码应该以“严格模式”执行。

在严格模式中,您无法,例如,使用未声明的变量。

以下版本的浏览器支持严格模式:

  • 版本 10 以后的 IE
  • 版本 4 以后的 Firefox
  • 版本 13 以后的 Chrome
  • 版本 5.1 以后的 Safari
  • 版本 12 以后的 Opera

声明严格模式

通过在脚本或函数的开头添加 "use strict"; 来声明严格模式。

在脚本开头进行声明,拥有全局作用域(脚本中的所有代码均以严格模式来执行):

实例

"use strict";
x = 3.14;       // 这会引发错误,因为 x 尚未声明

شما خودتان امتحان کنید

实例

"use strict";
myFunction();
function myFunction() {
     y = 3.14;   // 这会引发错误,因为 y 尚未声明
}

شما خودتان امتحان کنید

在函数中声明严格模式,拥有局部作用域(只有函数中的代码以严格模式执行):

x = 3.14;       // 这不会引发错误
myFunction();
function  myFunction() {
	"use strict";
	 y = 3.14;   // 这会引发错误
}

شما خودتان امتحان کنید

"use strict"; 语法

声明严格模式的语法被设计为兼容更早版本的 JavaScript。

编译 JavaScript 程序中的数值文字(比如 4+5)或字符串文字("Bill Gates")不会有负面效果。它只会编译为不存在的变量然后消失。

همه "use strict"; این تنها بر تأثیر对新 ترجمه‌های جدید تأثیر می‌گذارد که معنای آن را

چرا باید حالت سخت‌گیرانه را استفاده کنیم؟

حالت سخت‌گیرانه به ما کمک می‌کند تا JavaScript

حالت سخت‌گیرانه

به عنوان مثال، در JavaScript معمولی، خطاهای تایپی در نام‌های متغیر منجر به ایجاد متغیرهای جهانی می‌شود. در حالت سخت‌گیرانه، این عمل خطا ایجاد خواهد کرد، بنابراین نمی‌توان متغیرهای جهانی تصادفی ایجاد کرد.

در JavaScript معمولی، اگر به ویژگی‌های غیرقابل نوشتن نوشتید، توسعه‌دهنده هیچ خطایی دریافت نخواهد کرد.

در حالت سخت‌گیرانه، نوشتن به ویژگی‌های غیرقابل نوشتن، فقط خوانا، ناموجود، یا نوشتن به متغیرها یا شیءهای ناموجود، خطا ایجاد خواهد کرد.

موضوعات غیرمجاز در حالت سخت‌گیرانه

استفاده از متغیر بدون اعلام آن، مجاز نیست:

"use strict";
x = 3.14;                // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

شیء نیز یک متغیر است

استفاده از شیء بدون اعلام آن نیز مجاز نیست:

"use strict";
x = {p1:10, p2:20};      // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

حذف متغیر (یا شیء) مجاز نیست:

"use strict";
var x = 3.14;
delete x;                // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

حذف تابع مجاز نیست:

"use strict";
function x(p1, p2) {}; 
delete x;                 // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

نام‌های پارامترهای تکراری مجاز نیستند:

"use strict";
function x(p1, p1) {};   // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

متن‌های عددی اکوئی مجاز نیستند:

"use strict";
var x = 010;             // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

کاراکترهای فرار مجاز نیستند:

"use strict";
var x = \010;            // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

نوشتن به ویژگی‌های فقط خوانا مجاز نیست:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14;            // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

نوشتن به ویژگی‌های فقط خوانا مجاز نیست:

"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14;            // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

حذف ویژگی‌های غیرقابل حذف مجاز نیست:

"use strict";
delete Object.prototype; // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

رشته "eval" نمی‌تواند به عنوان متغیر استفاده شود:

"use strict";
var eval = 3.14;         // این خطا را ایجاد خواهد کرد

شما خودتان امتحان کنید

رشته "arguments" نمی‌تواند به عنوان متغیر استفاده شود:

"use strict";
var arguments = 3.14;    // این خطا را تولید می‌کند

شما خودتان امتحان کنید

with این جمله‌ها مجاز نیستند:

"use strict";
with (Math){x = cos(2)}; // این خطا را تولید می‌کند

شما خودتان امتحان کنید

به دلایل امنیتی، استفاده از eval() در محدوده‌ای که در آن فراخوانی می‌شود، متغیر ایجاد می‌شود:

"use strict";
eval ("var x = 2");
alert (x);               // این خطا را تولید می‌کند

شما خودتان امتحان کنید

در فراخوانی‌های مشابه f()، مقدار this به عنوان شیء کلی است. در حالت Strict Mode، اکنون آن شده است undefined

مطمئن شدن از آینده

واژه‌های کلیدی رزرو شده برای آینده در حالت Strict Mode مجاز نیستند. آنها عبارتند از:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
var public = 1500;      // این خطا را تولید می‌کند

شما خودتان امتحان کنید

اخطار

"use strict" دستورات فقط می‌توانند درآغازتشخیص داده شده است.