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; // 报错