整顿一下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语句。
不许可运用八进制字面量。