'use strict'

  在支持ECMAScript5严格模式解释器的浏览器下,在脚本开始处加上'use strict'指令来表示下面的代码将用严格模式的解释器来解释。

'use strict';
// something to do

  与普通模式区别的是

  • 禁止使用具有作用域链的with语句
  • 所有的变量须在声明后使用
    function test1() {
        a = 1; // 创建了一个全局变量
        console.log(1); // 1
    }
    function test2(){
        'use strict';
        b = 1; // 引用错误异常 ReferenceError
        console.log(b);
    }
  • 函数体内的this===undefined
    function test3(){
        console.log(this); // this为全局对象
    }
    function test4(){
        'use strict';
        console.log(this); // undefined
    }
  • call和apply方法里的this总是第一个传入的参数,不会进行转换
    function test5(){
        console.log(this);
    }
    function test6(){
        'use strict';
        console.log(this);
    }
    test5.call(); // 输出全局变量
    test6.call(); // 输出undefined
  • 操作不可编辑的属性会报错
    function test7(){
        'use strict';
        delete Object.prototype;
    }
    test7(); // 抛出TypeError异常
  • 同作用域下同名属性和同名方法会报错(非严格模式下不报错)
  • 不允许八进制直接量(非严格模式中某些浏览器实现可以)
  • 在严格模式中eval和arguments作为关键字,不能赋值,也不能用来做变量、函数名、用作函数参数或用作catch模块的标识符
  • delete后出现非法标识符会报错
  • 限制了对调用栈的检测能力,如arguments.callee和arguments.caller。这两个属性调用时在严格模式下都会抛出类型错误。
原文地址:https://www.cnblogs.com/gabin/p/3701243.html