Skip to content

严格模式

作用域

  1. 全局作用域

js 文件的顶部域使用 "use strict";,使得该文件下的脚本内容均在严格模式下运行。

javascript
// 启用严格模式
'use strict';

const request = () => {};

const message = 'Hello, world';

const sum = 30 + 20;

function printMessage() {
  console.log(message);
}
  1. 函数作用域

在一个函数体内部,将 "use strict"; 语句放在其他语句之前,表示该函数体的内容均在严格模式下运行。

变量

  1. 不支持意外创建全局变量
javascript
'use strict';
message = 'Hello'; // 我们会得到一个错误:ReferenceError: message is not defined

在非严格模式下,会自动在全局对象上创建一个 message 属性,并且赋值为 "Hello"

  1. 不支持 delete 变量
javascript
'use strict';
const colors = ['red', 'blue'];
delete colors; // 我们会得到一个错误:SyntaxError: Delete of an unqualified identifier in strict mode.
  1. 不支持保留字作为变量名
javascript
'use strict';
var package = '123'; // 我们会得到一个错误:SyntaxError: Unexpected strict mode reserved word

函数

  1. 不支持重复的函数参数名称

在非严格模式下,支持函数参数名称的重复,如 function test(a, a, b)

当我们访问标识符 a 时,实际上是访问第 2 个参数。即最后一个为准。

我们可以使用 arguments[0] 去访问第 1 个参数 a

javascript
test('Hello', 'World', 'You');
function test(a, a, b) {
  console.log(arguments[0]); // -> Hello
  console.log(a); // -> World
  console.log(b); // -> You
}

在严格模式下,不允许函数参数名称重复出现。

javascript
'use strict';
// 我们会得到一个错误:SyntaxError: Duplicate parameter name not allowed in this context
function test(a, a, b) {}
  1. 块级函数声明

在非严格模式下,块级函数声明的行为是怪异的,在不同浏览器上可能有不同的表现,在严格模式下,行为是可预测的。

参考资料

  1. MDN
  2. 《JavaScript 高级程序设计》第 4 版