严格模式是什么
严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。
不支持严格模式的刘览器与支持严格模式的浏览器行为上也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。
严格模式可以与非严格模式共存,所以脚本可以逐渐的选择性加入严格模式。
目的
首先,严格模式会将JavaScript陷阱直接变成明显的错误。
其次,严格模式修正了一些引擎难以优化的错误:同样的代码有些时候严格模式会比非严格模式下更快。
第三,严格模式禁用了一些有可能在未来版本中定义的语法。
在变量中的严格模式
开启严格模式
在JavaScript中想要开启严格模式,需要在所有代码之前,定义一个不会赋给任何变量的字符串:
"use strict";//或者'use strict';
如果之前的JavaScript代码是非严格模式的话,建议还要盲目为这段代码开启严格模式,这样可能会出现问题。建议按一个个函数去开启严格模式(至少在学习的过渡期要这样做)。
function fn(){
// 开启严格模式 - 局部作用域
'use strict';
var a = 200;
console.log(a);
}
fn();
在对象中的严格模式
不可删除的属性
在严格模式下,不能使用delete运算符删除不可删除的属性。
如下代码是非严格模式下使用delete运算符删除不可删除的属性,结果会静默失败。
delete Object.prototype;
如下代码是严格模式下使用delete运算符符删除不可删除的属性,结果会抛出异常。
"use strict";//开启严格模式
delete Object.prototype;//抛出TypeError错误
属性名必须唯一
在严格模式下,一个对象内的所有属性名在对象内必须唯一。
如下代码是非严格模式下重名属性是允许的,最后一个重名的属性决定其属性值。
var o = {p:1, p: 2} ;
如下代码是严格模式下重名属性被认为是语法错误。
"use strict";//开启严格模式
var o = {p:1, p:2};//!!!语法错误
在函数中的严格模式
参数名必须唯一
在严格模式下,要求命名函数的参数必须唯一。
如下代码是非严格模式下最后一个重名参数名会掩盖之前的重名参数,之前的参数仍然可以通过arguments[ i ]来访问。
function sum(a, a, c){ }
如下代码是严格模式下重名参数被认为是语法错误。
function sum(a, a, c) {//!!!语法错误
"use strict";
return a + a + c;//代码运行到这里会出错
}
arguments的不同
- 在严格模式下,arguments对象的行为也有所不同。
- 非严格模式下,修改命名参数的值也会反应到arguments对象中。严格模式下,命名参数与arguments对象是完全独立的。
function showvalue( value ){
value = "foo";
console.log(value);// foo
console.log( arguments[0] );//非严格模式下foo
//严格模式下hello
}
showvalue("hello");