JS严厉形式

整顿一下JS严厉形式中不同于平常形式的处所。

启用严厉形式

有两种体式格局启用严厉形式

  1. js文件第一行代码为’use strict’;

  2. 要领内第一行代码为’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引擎和如今有差异的缘由吧。

语法限定

变量

  1. 不许可不测建立全局变量。声明一个新变量时,变量名前必需有var/let/const。

  2. 不许可对变量实行delete操纵。

object

对象属性修正限定
  1. 不许可修正只读属性。

    'use strict';
    var fn = {};
    Object.defineProperty(fn, 'c', {writable : false});
    fn.c = 2; //TypeError: Cannot assign to read only property 'c' of object '#'
  2. 不许可对不可设置的属性实行delete操纵。

    var fn = {};
    Object.defineProperty(fn, 'c', {configurable : false});
    delete fn.c; //TypeError: Cannot delete property 'c' of #
防改动对象修正限定
  1. 不许可为不可扩大对象增加属性或要领。

    'use strict';
    var fn ={a:1};
    Object.preventExtensions(fn);
    fn.b =2;  //TypeError: Can't add property b, object is not extensible
  2. 不许可为密封对象增加属性或要领,且不许可对密封对象的属性实行delete操纵。

    'use strict';
    var fn ={a:1};
    Object.seal(fn);
    delete fn.a;  //TypeError: Cannot delete property 'a' of #
  3. 不许可为凝结对象增加属性或要领,且不许可对凝结对象的属性实行delete操纵,且不许可修正凝结对象的属性。

    'use strict';
    var fn ={a:1};
    Object.freeze(fn);
    fn.a = 2;  //TypeError: Cannot assign to read only property 'a' of object '#'

function

  1. 要领不许可有多个定名雷同的形参。

    'use strict';
    function fn(a, a){console.log(a);}
    fn(2,3); //SyntaxError: Duplicate parameter name not allowed in this context
    /*以上代码在非严厉形式中显现效果为3,只能接见末了一个同名参数。*/
  2. 形介入arguments完整自力。

    'use strict';
    function showValue(value){
        value = "Foo";    
        console.log(value); //"Foo"    
        console.log(arguments[0]); //非严厉形式:"Foo";严厉形式:"Hi"
    }showValue("Hi");
  3. 不许可运用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时会报错。

其他

  1. 不许可运用with语句。

  2. 不许可运用八进制字面量。

    原文作者:梦梦她爹
    原文地址: https://segmentfault.com/a/1190000006672217
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞