整理一下JS严格模式中不同于一般模式的地方。
启用严格模式
有两种方式启用严格模式
js文件第一行代码为'use strict';
方法内第一行代码为'use strict';
第一种方式对整个js文件中所有代码启用严格模式;
第二种方式对单个方法中所有代码启用严格模式;
每一段内嵌js代码视同单个js文件。如下面代码中第一段script内嵌js中启用了严格模式,但不会影响其他script内嵌js:
<script>
'use strict';
a = 1; //error
</script>
<script>
b = 1; //no error
</script>
注:之前看阮一峰老师的一篇关于严格模式的文章里说“只要前面不是产生实际运行结果的语句,use strict;
可以不在第一行,比如直接跟在一个空的分号后面。”然而在chrome和node v4.5.0版本中测试结果use strict
之前有任何代码(包括一个空的分号),都不会启用严格模式,也就是说use strict
必须放在最起始位置。可能是写这篇文章的时候js引擎和现在有差别的原因吧。
语法限制
变量
不允许意外创建全局变量。声明一个新变量时,变量名前必须有var/let/const。
不允许对变量执行delete操作。
object
对象属性改动限制
-
不允许修改只读属性。
'use strict'; var fn = {}; Object.defineProperty(fn, 'c', {writable : false}); fn.c = 2; //TypeError: Cannot assign to read only property 'c' of object '#'
-
不允许对不可配置的属性执行delete操作。
var fn = {}; Object.defineProperty(fn, 'c', {configurable : false}); delete fn.c; //TypeError: Cannot delete property 'c' of #
防篡改对象改动限制
-
不允许为不可扩展对象添加属性或方法。
'use strict'; var fn ={a:1}; Object.preventExtensions(fn); fn.b =2; //TypeError: Can't add property b, object is not extensible
-
不允许为密封对象添加属性或方法,且不允许对密封对象的属性执行delete操作。
'use strict'; var fn ={a:1}; Object.seal(fn); delete fn.a; //TypeError: Cannot delete property 'a' of #
-
不允许为冻结对象添加属性或方法,且不允许对冻结对象的属性执行delete操作,且不允许修改冻结对象的属性。
'use strict'; var fn ={a:1}; Object.freeze(fn); fn.a = 2; //TypeError: Cannot assign to read only property 'a' of object '#'
function
-
方法不允许有多个命名相同的形参。
'use strict'; function fn(a, a){console.log(a);} fn(2,3); //SyntaxError: Duplicate parameter name not allowed in this context /*以上代码在非严格模式中显示结果为3,只能访问最后一个同名参数。*/
-
形参与arguments完全独立。
'use strict'; function showValue(value){ value = "Foo"; console.log(value); //"Foo" console.log(arguments[0]); //非严格模式:"Foo";严格模式:"Hi" }showValue("Hi");
-
不允许使用arguments.callee
'use strict'; (function showValue(value){ console.log(arguments.callee); })();//TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
eval
eval中声明的的变量或方法作用域仅限eval内部,不再会被创建到其所在的上下文中。
'use strict';
(function doSomething(){
var y = eval("var x=10;x*2");
console.log(y); //20
console.log(x); //ReferenceError: x is not defined
})();
this
this在严格模式下始终指向指定的值,包括null和undefined。
window.color="red"; //node环境中为global.color = "red";
function displayColor(){
console.log(this.color);
}
displayColor.call(null);
以上代码在非严格模式中,this会默认指向全局变量;但是在严格模式中,this指向null,因此调用this.color时会报错。
其他
不允许使用with语句。
不允许使用八进制字面量。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。