Skip to content

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.calleearguments.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.argumentsFunction.prototype.caller是不可删除的属性,当设置或检索时会抛出错误
  • implementsinterfaceletpackageprivateprotectedpublicstaticyield是保留关键字
  • 函数声明只允许在脚本或函数的顶层使用