整理一下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. 不允许使用八进制字面量。


梦梦她爹
1.8k 声望122 粉丝

« 上一篇
ES6-Promise