个性化阅读
专注于IT技术分析

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); // 5

function 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。但是,为了获得最佳的兼容性,应该避免在程序中使用保留关键字作为变量名或函数名。

提示:保留字,也称为关键字,是JavaScript语言语法中的特殊字,例如var、if、for、function等。有关JavaScript中所有保留字的完整列表,请参阅JS保留字关键字参考。

赞(0)
未经允许不得转载:srcmini » JS严格模式 – JavaScript高级教程

评论 抢沙发

评论前必须登录!