Appearance
严格模式
作用域
- 全局作用域
在 js
文件的顶部域使用 "use strict";
,使得该文件下的脚本内容均在严格模式下运行。
javascript
// 启用严格模式
'use strict';
const request = () => {};
const message = 'Hello, world';
const sum = 30 + 20;
function printMessage() {
console.log(message);
}
- 函数作用域
在一个函数体内部,将 "use strict";
语句放在其他语句之前,表示该函数体的内容均在严格模式下运行。
变量
- 不支持意外创建全局变量
javascript
'use strict';
message = 'Hello'; // 我们会得到一个错误:ReferenceError: message is not defined
在非严格模式下,会自动在全局对象上创建一个 message
属性,并且赋值为 "Hello"
。
- 不支持 delete 变量
javascript
'use strict';
const colors = ['red', 'blue'];
delete colors; // 我们会得到一个错误:SyntaxError: Delete of an unqualified identifier in strict mode.
- 不支持保留字作为变量名
javascript
'use strict';
var package = '123'; // 我们会得到一个错误:SyntaxError: Unexpected strict mode reserved word
函数
- 不支持重复的函数参数名称
在非严格模式下,支持函数参数名称的重复,如 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) {}
- 块级函数声明
在非严格模式下,块级函数声明的行为是怪异的,在不同浏览器上可能有不同的表现,在严格模式下,行为是可预测的。
参考资料
- MDN
- 《JavaScript 高级程序设计》第 4 版