JAVASCRIPT 基础教程
JAVASCRIPT & DOM
JAVASCRIPT & BOM
JAVASCRIPT 高级教程
JAVASCRIPT 示例
JAVASCRIPT 参考

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 不能用作标识符

在严格模式下,名称evalarguments被视为关键字,因此不能用作变量名、函数名或函数参数名等 .

"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 中所有保留字的完整列表。

Advertisements