JavaScript 严格模式
严格模式是 ES 5 引入的一种运行模式,严格模式有助于消除原有的静默错误,修复了一些原有的运行缺陷。
严格模式是 ES 5 引入的一种运行模式,严格模式有助于消除原有的静默错误,修复了一些原有的运行缺陷。
JavaScript 严格模式使用字符串 "use strict";
声明。
注意:"use strict";
不是一个语句,而是一个字符串用于提示。这样就会被早期版本的 JavaScript 忽略。
除 Internet Explorer 9 及更低版本外,所有现代浏览器都支持“严格使用”。
下表的数字指定了完全支持指令的第一个浏览器版本:
Chrome | IE/Edge | Firefox | Safari | Opera | |
---|---|---|---|---|---|
"use strict" |
13.0 | 10.0 | 4.0 | 6.0s | 12.1 |
您可以在所有程序中使用严格模式。它可以帮助您编写更清晰的代码,例如防止使用未声明的变量。
"use strict"
只是一个字符串,因此 IE 9 即使不理解它也不会抛出错误。
声明严格模式
通过在脚本或函数的开头添加 "use strict"
来声明严格模式。
!! "use strict"
指令仅在脚本或函数的开头才有效。
在脚本的开头声明 "use strict"
,具有全局作用域,脚本中的所有代码都将在严格模式下执行。
"use strict";
x = 3.14; // 因为 x 未声明而报错
在函数内部声明 "use strict"
,具有全局作用域,,只有函数内部的代码处于严格模式:
x = 3.14; // 这里不会报错
myFunction();
function myFunction() {
"use strict";
y = 3.14; // 这里会报错
}
为什么是严格模式?
严格模式使编写更安全、更高效、可读性更强 JavaScript 变得更容易。设立严格模式的目的,主要有以下几个:
- 避免一些原有的静默错误,给出更确切的错误提示。
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
- 提高编译器效率,增加运行速度;
- 为未来新版本的 Javascript 做好铺垫。
严格模式的要求
不允许不声明使用变量:
"use strict";
x = 3.14; // 报错
"use strict";
x = { p1: 10, p2: 20 }; // 报错
不允许删除变量(或对象):
"use strict";
let x = 3.14;
delete x; // 报错
不允许删除函数:
"use strict";
function x(p1, p2) {};
delete x; // 报错
不允许重复的参数名称:
"use strict";
function x(p1, p1) {} // 报错
八进制数字文字是不允许的:
"use strict";
let x = 010; // 报错
不允许使用八进制转义字符:
"use strict";
let x = "\010"; // 报错
不允许修改只读属性:
"use strict";
const obj = {};
Object.defineProperty(obj, "x", { value: 0, writable: false });
obj.x = 3.14; // 报错
不允许修改仅 getter 属性:
"use strict";
const obj = {
get x() {
return 0;
},
};
obj.x = 3.14; // 报错
不允许删除不可删除的属性:
"use strict";
delete Object.prototype; // 报错
不能使用 eval
作为变量名:
"use strict";
let eval = 3.14; // 报错
不能使用 arguments
作为变量名:
"use strict";
let arguments = 3.14; // 报错
不允许 with
声明:
"use strict";
with (Math) {
x = cos(2);
} // 报错
出于安全原因,不允许在 eval()
调用的范围内创建变量:
"use strict";
eval("let x = 2");
alert(x); // 报错
this
函数中的关键字在严格模式下的行为不同。
this
关键字是指调用函数的对象。如果未指定对象,则严格模式下的函数中的 this 为 undefined
,普通模式下的 this 返回全局对象(窗口):
"use strict";
function myFunction() {
alert(this); // will alert "undefined"
}
myFunction();
严格模式下的关键字
为未来 JavaScript 版本保留的关键字不能在严格模式下用作变量名。
包括:
implements
interface
let
package
private
protected
public
static
yield
"use strict";
let public = 1500; // 报错