目录

JavaScript 严格模式


"use strict";定义 JavaScript 代码应在 "strict mode" 中执行。


"use strict" 指令

这个"use strict"指令是 ECMAScript 版本 5 中的新指令。

它不是一个语句,而是一个文字表达式,被早期版本的 JavaScript 忽略。

的目的"use strict"表示代码应该在"strict mode"中执行。

例如,在严格模式下,您不能使用未声明的变量。

除 Internet Explorer 9 及更低版本外,所有现代浏览器都支持 "use strict":

Directive
"use strict" 13.0 10.0 4.0 6.0 12.1

表中的数字指定完全支持该指令的第一个浏览器版本。

您可以在所有程序中使用严格模式。它可以帮助您编写更清晰的代码,例如防止您使用未声明的变量。

"use strict"只是一个字符串,因此 IE 9 即使不理解它也不会抛出错误。


声明严格模式

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

在脚本开头声明,它具有全局作用域(脚本中的所有代码都将以严格模式执行):

示例

"use strict";
x = 3.14;       // This will cause an error because x is not declared
亲自试一试 »

示例

"use strict";
myFunction();

function myFunction() {
  y = 3.14;   // This will also cause an error because y is not declared
}
亲自试一试 »

在函数内部声明,它具有局部作用域(只有函数内部的代码处于严格模式):

x = 3.14;       // This will not cause an error.
myFunction();

function myFunction() {
  "use strict";
  y = 3.14;   // This will cause an error
}
亲自试一试 »


"use strict";语法

用于声明严格模式的语法旨在与旧版本的 JavaScript 兼容。

在 JavaScript 程序中编译数字文字 (4 + 5;) 或字符串文字 ("John Doe";) 没有副作用。它只是编译为一个不存在的变量并终止。

所以"use strict";对于新编译器来说,唯一重要的是 "understand" 它的含义。


为什么是严格模式?

严格模式使编写 "secure" JavaScript 变得更加容易。

严格模式将之前接受的 "bad syntax" 更改为真正的错误。

举个例子,在普通的 JavaScript 中,错误输入变量名会创建一个新的全局变量。在严格模式下,这会引发错误,从而不可能意外创建全局变量。

在普通 JavaScript 中,开发人员不会收到任何为不可写属性赋值的错误反馈。

在严格模式下,对不可写属性、仅 getter 属性、不存在属性、不存在变量或不存在对象的任何赋值都会引发错误。


严格模式下不允许

不允许使用变量而不声明它:

"use strict";
x = 3.14;                // This will cause an error

亲自试一试 »

对象也是变量。

不允许使用未声明的对象:

"use strict";
x = {p1:10, p2:20};      // This will cause an error

亲自试一试 »

不允许删除变量(或对象)。

"use strict";
let x = 3.14;
delete x;                // This will cause an error

亲自试一试 »

不允许删除函数。

"use strict";
function x(p1, p2) {};
delete x;                // This will cause an error 

亲自试一试 »

不允许重复参数名称:

"use strict";
function x(p1, p1) {};   // This will cause an error

亲自试一试 »

不允许使用八进制数字文字:

"use strict";
let x = 010;             // This will cause an error

亲自试一试 »

不允许使用八进制转义字符:

"use strict";
let x = "\010";            // This will cause an error

亲自试一试 »

不允许写入只读属性:

"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // This will cause an error

亲自试一试 »

不允许写入仅获取属性:

"use strict";
const obj = {get x() {return 0} };

obj.x = 3.14;            // This will cause an error

亲自试一试 »

不允许删除不可删除的属性:

"use strict";
delete Object.prototype; // This will cause an error

亲自试一试 »

这个单词eval不能用作变量:

"use strict";
let eval = 3.14;         // This will cause an error

亲自试一试 »

这个单词arguments不能用作变量:

"use strict";
let arguments = 3.14;    // This will cause an error

亲自试一试 »

这个with不允许声明:

"use strict";
with (Math){x = cos(2)}; // This will cause an error

亲自试一试 »

出于安全原因,eval()不允许在调用它的范围内创建变量。

在严格模式下,变量在声明之前不能使用:

"use strict";
eval ("x = 2");
alert (x);      // This will cause an error

亲自试一试 »

在严格模式下,eval() 不能使用 var 关键字声明变量:

"use strict";
eval ("var x = 2");
alert (x);    // This will cause an error

亲自试一试 »

eval() 不能使用 let 关键字声明变量:

eval ("let x = 2");
alert (x);        // This will cause an error

亲自试一试 »

这个this函数中的关键字在严格模式下的行为有所不同。

这个this关键字指的是调用该函数的对象。

如果未指定对象,严格模式下的函数将返回undefined正常模式下的函数将返回全局对象(窗口):

"use strict";
function myFunction() {
  alert(this); // will alert "undefined"
}
myFunction();

亲自试一试 »


面向未来!

为未来 JavaScript 版本保留的关键字不能在严格模式下用作变量名。

这些都是:

  • 实施
  • 界面
  • 包裹
  • 私人的
  • 受保护的
  • 民众
  • 静止的
  • 屈服
"use strict";
let public = 1500;      // This will cause an error

亲自试一试 »

小心!

"use strict" 指令仅在开始脚本或函数的。