"use strict"是JavaScript中一个非常好的特性,而且非常容易使用。
"use strict"作用
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
使用方法
// file.js
"use strict"
function test(){}
这样的file.js都会应用上"use strict"模式。
如果你仅想在一个函数中使用,如下代码仅仅在test中起作用
// file.js
function test(){
"use strict";
function temp(){}
}
严格模式的作用
1、检查对象中的重复键
es6支持重复键
let value = {
a : 0,
b: 1,
a : 1
}
这段代码会抛出一个错误因为 a 出现了两次。这比你用眼睛去找错误要快多了。
2、未声明变量
plane = 5;
3、重复的参数
function test(data, data){
}
注意data出现了两次,因此会抛出一个错误。
4、限制函数中的arguments
function test(data){
arguments[0] = 'aaa';
console.log(data);
}
run('bbb'); //'aaa';
现在你可以使用"use strict"
function test(data){
"use strict";
arguments[0] = 'aaa';
console.log(data, arguments);
}
run('bbb'); //bbb { '0': 'aaa' }
arguments[0] = 'aaa' 改变了参数data,在严格模式下,这种操作无效,只对arguments起作用
5、不能用前导0声明8进制直接量
例如:
let a = 012;
严格模式主要有以下限制。
- 变量必须声明后再使用
- 函数的参数不能有同名属性,否则报错
- 不能使用
with
语句 - 不能对只读属性赋值,否则报错
- 不能使用前缀0表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错
- 不能删除变量
delete prop
,会报错,只能删除属性delete global[prop]
eval
不会在它的外层作用域引入变量eval
和arguments
不能被重新赋值arguments
不会自动反映函数参数的变化- 不能使用
arguments.callee
- 不能使用
arguments.caller
- 禁止
this
指向全局对象 - 不能使用
fn.caller
和fn.arguments
获取函数调用的堆栈 - 增加了保留字(比如
protected
、static
和interface
)