JavaScript 严格模式
在本教程中,您将学习如何在 JavaScript 中以严格模式执行代码。
什么是严格模式
严格模式是在 ECMAScript 5 (ES5) 中引入的。它是一种语义上更严格或受限制的 JavaScript 语言版本,它会为那些以其他方式静默处理的错误产生错误。例如,在 non-strict 模式下,如果您初始化一个变量而不使用 var
关键字声明它(例如 x = 5;
) , JavaScript 解释器会假设你引用了一个全局变量,如果不存在这样的变量,它会自动创建一个。
此外,不推荐使用的功能也可能在严格模式下产生错误。因此,严格模式可以减少错误、提高应用程序的安全性和整体性能。
启用严格模式
要启用严格模式,您只需在脚本开头添加字符串 "use strict"
,如下例所示:
"use strict";
// 你所有的代码都在这里
x = 5; // ReferenceError: x 未定义
console.log(x);
如果您将 "use strict"
指令添加为 JavaScript 程序的第一行,则严格模式将应用于整个脚本。 但是,您也可以仅在函数内打开严格模式,如下所示:
x = 5;
console.log(x); // 5
function sayHello() {
"use strict";
str = "Hello World!"; // ReferenceError: str 未定义
console.log(str);
}
sayHello();
注意: "use strict"
指令仅在脚本或函数的开头被识别。 除 Internet Explorer 9 和更低版本外,所有现代浏览器都支持 "use strict"
指令。 此外,不支持 "use strict"
指令的浏览器会默默地忽略它并以非严格模式解析 JavaScript。
严格模式下的一般限制
严格模式会改变语法和运行时行为。 在以下部分中,我们将了解在严格模式下实施的一般限制:
不允许使用未声明的变量
如您所知,在严格模式下,必须声明所有变量。 如果您将值分配给不是已声明变量的标识符,则会引发 ReferenceError。
"use strict";
function doSomething() {
msg = "Hi, there!"; // ReferenceError: msg is not defined
return msg;
}
console.log(doSomething());
不允许删除变量或函数
在严格模式下,如果你试图删除一个变量或一个函数,将会抛出一个语法错误。 而在非严格模式下,这种尝试会静默失败,并且删除表达式的计算结果为 false
。
"use strict";
var person = {name: "Peter", age: 28};
delete person; // SyntaxError
同样,当您尝试在严格模式下删除函数时,您将收到语法错误:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxError
不允许重复参数名称
在严格模式下,如果函数声明有两个或多个同名参数,则会引发语法错误。 在非严格模式下,不会发生错误。
"use strict";
function square(a, a) { // SyntaxError
return a * a;
}
console.log(square(2, 2));
eval 方法不能改变作用域
在严格模式下,出于安全原因,传递给 eval()
的代码不能像在非严格模式下那样在周围范围内声明/修改变量或定义函数。
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined
eval 和 arguments 不能用作标识符
在严格模式下,名称eval
和arguments
被视为关键字,因此不能用作变量名、函数名或函数参数名等 .
"use strict";
var eval = 10; // SyntaxError
console.log(eval);
不允许使用 with 语句
在严格模式下,with
语句是不允许的。 with
语句将 object 的属性和方法添加到当前作用域。 因此,嵌套在 with
语句中的语句可以直接调用对象的属性和方法,而无需引用它。
"use strict";
// 没有 with 声明
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;
// Using with statement
var radius2 = 5;
with(Math) { // SyntaxError
var area2 = PI * radius2 * radius2;
}
不允许写入只读属性
在严格模式下,将值分配给不可写属性、仅获取属性或不存在的属性将引发错误。 在非严格模式下,这些尝试会以静默方式失败。
"use strict";
var person = {name: "Peter", age: 28};
Object.defineProperty(person, "gender", {value: "male", writable: false});
person.gender = "female"; // TypeError
不允许向不可扩展的对象添加新属性
在严格模式下,尝试在不可扩展或不存在的对象上创建新属性也会引发错误。 但是在非严格模式下,这些尝试会默默地失败。
"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
不允许使用八进制数
在严格模式下,八进制数(以零为前缀的数字,例如 010、0377)是不允许的。 但是,所有非严格模式下的浏览器都支持它。 然而,在 ES6 中,八进制数字是通过在数字前面加上 0o
来支持的,即 0o10、0o377 等。
"use strict";
var x = 010; // SyntaxError
console.log(parseInt(x));
您可以在上面的示例中清楚地看到,严格模式如何帮助您防止在编写 JavaScript 程序时经常被忽视的常见错误。
不允许为将来保留的关键字
正如您在前面的章节中已经知道的那样,保留字 不能用作 JavaScript 程序中的标识符(变量名、函数名和循环标签)。 除此之外,严格模式还对保留供将来使用的关键字的使用施加了限制。
根据最新的 ECMAScript 6(或 ES6)标准,当在严格模式代码中找到这些关键字时,这些关键字是保留关键字:await
, implements
, interface
, package
, private
, protected
, public
, 和 static
。 但是,为了获得最佳兼容性,您应该避免在程序中使用保留关键字作为变量名或函数名。
提示: 保留字也称为关键字,是 JavaScript 语言语法中的特殊字,例如 var
, if
, for
, function
等。请参阅 JS 保留关键字参考 以获取 JavaScript 中所有保留字的完整列表。