JS严格模式 – JavaScript高级教程

上一章JavaScript教程请查看:JS闭包和闭包函数
在本教程中,我们将学习如何在JavaScript的严格模式下执行代码。
什么是严格模式?严格模式是在ECMAScript 5 (ES5)中引入的,它是一个语义上更严格的或受限制的JavaScript语言版本,为那些以其他方式静默处理的错误生成错误。例如,在非严格模式下,如果你初始化一个变量,而没有使用var关键字声明它(例如x = 5; ), JavaScript解释器将假定你引用的是一个全局变量,如果不存在这样的变量,它将自动创建一个全局变量。
另外,不推荐的特性也可能在严格模式下产生错误。因此,严格模式减少了bug,提高了应用程序的安全性和整体性能。
使严格模式要启用严格模式,你只需要在你的脚本开头添加字符串“use strict”,如下例所示:

"use strict"; // 你所有的代码都在这里 x = 5; // ReferenceError: x is not defined console.log(x);

如果你将“use strict”指令添加到JavaScript程序的第一行,那么strict模式适用于整个脚本。但是,你也可以只在一个函数中打开严格模式,就像这样:
x = 5; console.log(x); // 5function sayHello() { "use strict"; str = "Hello World!"; // ReferenceError: str is not defined console.log(str); } sayHello();

注意:“use strict”指令只能在脚本或函数的开头识别。所有的现代浏览器都支持“use strict”指令,除了Internet Explorer 9和更低的版本。另外,不支持“use strict”指令的浏览器会忽略它,并在非严格模式下解析JavaScript。
严格模式下的一般限制严格模式同时改变语法和运行时行为。在下面的章节中,我们将看到在strict模式下执行的一般限制:
未声明的变量是不允许的
你已经知道,在严格模式中,必须声明所有变量。如果将一个值赋给一个不是声明变量的标识符,将抛出一个ReferenceError。
"use strict"; function doSomething() { msg = "Hi, there!"; // ReferenceError: msg is not defined return msg; } console.log(doSomething());

不允许删除变量或函数
在严格模式下,如果试图删除一个变量或函数,将抛出语法错误。然而,在非严格模式下,这种尝试会以静默方式失败,delete表达式的计算结果为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和参数不能用作标识符
在严格模式中,名称eval和参数被视为关键字,因此它们不能用作变量名、函数名或函数参数名等。
"use strict"; var eval = 10; // SyntaxError console.log(eval);

不允许使用with语句
在严格模式下,不允许使用with语句。with语句将对象的属性和方法添加到当前范围。因此,嵌套在with语句中的语句可以直接调用对象的属性和方法,而不需要引用它。
"use strict"; // 没有with语句 var radius1 = 5; var area1 = Math.PI * radius1 * radius1; // 使用with语句 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); // 锁定person对象 console.log(Object.isExtensible(person)); // false person.gender = "male"; // TypeError

八进制数是不允许的
在严格模式下,八进制数(以0为前缀的数字,如010,0377)是不允许的。不过,所有浏览器都支持非严格模式。但是,在ES6中,八进制数可以用0o作为前缀,即0o10、0o377等。
"use strict"; var x = 010; // SyntaxError console.log(parseInt(x));

在上面的例子中,你可以清楚地看到strict模式如何帮助你避免在编写JavaScript程序时经常被忽略的常见错误。
将来保留关键字不允许使用
正如你在前几章中已经知道的,在JavaScript程序中,保留字不能用作标识符(变量名、函数名和循环标签)。此外,严格模式还对那些保留到将来的关键字的使用施加了限制。
根据最新的ECMAScript 6(或ES6)标准,当在严格模式代码中发现这些关键字时,它们是保留关键字:await、implements、interface、package、private、protected、public和static。但是,为了获得最佳的兼容性,应该避免在程序中使用保留关键字作为变量名或函数名。
【JS严格模式 – JavaScript高级教程】提示:保留字,也称为关键字,是JavaScript语言语法中的特殊字,例如var、if、for、function等。有关JavaScript中所有保留字的完整列表,请参阅JS保留字关键字参考。

    推荐阅读