Use strict
title: 'use strict' 是什么,使用它有哪些关键好处? shortTitle: 严格模式介绍 type: question language: javascript tags: [function,object] cover: palm-tree-house excerpt: JavaScript 的严格模式可以使你的代码更快、更清晰和更安全。 dateModified: 2021-11-28
严格模式可以应用于整个脚本或单个函数,在其他语句之前加上 'use strict'
。
```js [script.js] 'use strict'; const x = "Hello from a strict mode script";
```js [other.js]
function strict() {
'use strict';
const x = 'Hello from a strict mode function';
}
这会强制对 JavaScript 代码进行更严格的解析和错误处理,如下所述。
避免意外的全局变量
严格模式使得由于变量名拼写错误而意外创建全局变量变得不可能。在严格模式下,会将本应意外创建全局变量的赋值操作视为错误并抛出异常:
'use strict';
myVariable = 42;
// 上述代码会抛出 ReferenceError,假设之前没有声明名为 myVariable 的全局变量
消除隐式错误
严格模式将一些之前被接受的错误转换为错误。其中包括:
- 分配给其他情况下会静默失败的变量
- 删除不可删除的属性或普通名称
- 函数参数中的重复名称
- 以0为前缀的八进制字面量
- 在原始值上设置属性
'use strict';
let undefined = 5; // TypeError(不可写的全局变量)
let obj = {};
Object.defineProperty(obj1, 'x', { value: 1, writable: false });
obj.x = 2; // TypeError(不可写的属性)
delete Object.prototype; // TypeError(不可删除的属性)
delete something; // SyntaxError(普通名称)
const sum (a, b, b) { // SyntaxError(重复的参数名称)
return a + b + b;
}
const x = 012; // SyntaxError(以0为前缀的八进制字面量)
false.true = 10; // TypeError(原始值上的属性)
简化的 eval
严格模式通过防止在周围作用域中引入新变量,使 eval
更加透明。在严格模式下,eval
仅为正在评估的代码创建变量。
'use strict';
let x = 1;
eval('let x = 3; console.log(x);'); // 输出:3
console.log(x); // 输出:1
简化的arguments
严格模式简化了arguments
,通过删除一些副作用。arguments
不再是别名,因此它们始终引用函数调用时的原始参数。此外,不再支持arguments.callee
和arguments.caller
。
'use strict';
function f(x) {
x = 5;
return x === arguments[0];
}
f(10); // false
没有this
装箱
严格模式通过限制通过this
访问全局对象来使JavaScript更安全。在严格模式下,this
不会被装箱(强制成对象),这意味着如果未指定,它将是undefined
而不是全局对象。
'use strict';
function f() {
return this;
}
f(); // undefined
其他变化
严格模式实现了一些其他不太常提及的变化。这些变化包括:
- 使用
with
是被禁止的,如果使用会导致错误 Function.prototype.arguments
和Function.prototype.caller
是不可删除的属性,当设置或检索时会抛出错误implements
、interface
、let
、package
、private
、protected
、public
、static
和yield
是保留关键字- 函数声明只允许在脚本或函数的顶层使用