通过‘use strict’在任何其他语句之前包含,可以将严格模式应用于整个脚本或单个函数 。那使用它有什么好处呢?下面将详细解释。
作用详情
通过'use strict'
在任何其他语句之前包含,可以将严格模式应用于整个脚本或单个函数 。
// script.js
'use strict';
const x = "Hello from a strict mode script";
// 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 (non-writable global)
let obj = {};
Object.defineProperty(obj1, 'x', { value: 1, writable: false });
obj.x = 2; // TypeError (non-writable property);
delete Object.prototype; // TypeError (undeletable property)
delete something; // SyntaxError (plain name)
const sum (a, b, b) { // SyntaxError (duplicated argument name)
return a + b + b;
}
const x = 012; // SyntaxError (0-prefixed octal literal)
false.true = 10; // TypeError (property on primitive)
简化版 eval
严格模式eval
通过防止在周围范围内引入新变量而变得更加透明。在严格模式下,eval
仅为正在评估的代码创建变量。
'use strict';
let x = 1;
eval('let x = 3; console.log(x);'); // LOGS: 3
console.log(x); // LOGS: 1
简化版 arguments
严格模式arguments
通过消除它们的一些副作用来简化。arguments
没有别名,因此它们总是在调用函数时引用原始参数。此外,arguments.callee
和arguments.caller
不再支持。
没有this包装
严格模式通过限制访问全局对象使 JavaScript 更加安全this
。在严格模式下,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
是保留关键字- 函数语句只允许在函数脚本的顶层