前言
严格模式是ES5中引入的概念,使用严格模式,可以在函数内部选择进行较为严格的全局或局部错误条件检测。使用严格模式的好处是可以提早知道代码中存在的错误,及时捕获一些可能导致编程错误的ECMAScript行为。
一、使用严格模式
字符串”use strict”是一个使用严格模式的编译指示,支持严格模式的引擎将会启动严格模式,不支持的则当作遇到一个未赋值的字符串字面量。
既可以在全局中声明使用严格模式,也可以在函数中声明使用,两者情况下的作用域不同。
二、对变量的限制
首先,不允许意外创建全局变量。即1
message = 'hello world';
这行代码在非严格模式下将message定义为全局属性,而严格模式则抛出ReferenceError错误。
其次,不能对变量调用delete操作符。1
delete message;
非严格模式下,会返回false静默错误。而严格模式则抛出ReferenceError错误。
最后,严格模式还不允许变量使用implements、interface、let、package等保留字。
三、操作对象
- 为只读属性赋值会抛出TypeError;
- 对不可配置的属性调用delete操作符会抛出TypeError;
- 对不可扩展的对象添加属性会抛出TypeError。
- 对象的属性名必须唯一:
1 | var person = { |
非严格模式中,最后声明的name属性值生效,而严格模式中这种代码会导致语法错误。
四、函数
- 函数形参必须唯一,不能重名。
1
2
3function add(num,num){
}
非严格模式中,重名形参只能访问到最后一个,而严格模式下会报语法错误。
- 严格模式修改形参无法反映到arguments对象。
- 禁用arguments.callee和arguments.caller
- 保留字无法用来命名函数
- if语句中无法命名函数:
1
2
3
4
5if(1){
function add(a,b){
}
}
非严格模式下会将add函数提升到if语句外,而严格模式报语法错误。
五、eval()
eval()不再能够创建变量:1
2eval(var x = 10);
alert(x);
非严格模式下,alert正常运行;严格模式下报错。
六、this的正确指向
1 | var color = 'red'; |
以上代码在非严格模式中,值为null的this会转换为window,因此能够正常弹出对话框red,而严格模式下,this的值为null,报错。
七、其他变化
- 抛弃with语句。
- 0开头的八进制字面量无效。
- 若将八进制字面量传入parseInt(),会被当作0开头的十进制数处理。
总结
严格模式如其名,提供了更加规范也更加合理的代码标准,理解严格模式也是非常重要的。