严格模式是在ES5中新增的指令,他不是一个声明,而是一个字面表达式,这样在老版本的浏览器中会被忽视而不至于会引起错误.

兼容版本

IE Chrome Firefox Safari Opera
10+ 13+ 4+ 5.1+ 12+

宣告严格模式

"use strict";
x = 3.14; // 进入严格模式这里会报错

严格模式需要在一段脚本或者函数的开头宣告才能被识别,在脚本开头这个脚本中的代码都将以严格模式执行,函数开头宣告则只有这个函数中的代码会进入严格模式.(类似javascript的函数作用域)

x = 3.14;       // 这里不会报错,因为不是严格模式
myFunction();

function myFunction() {
  "use strict";
  y = 3.14;   // 这里是严格模式会报错
}

严格模式中不允许的代码

  • 变量未声明不可使用

    "use strict";
    x = 3.14; // x未声明所以报错
    
  • 不可删除变量和函数

    "use strict";
    var x = 3.14;
    delete x;  // 变量无法删除报错
    
    "use strict";
    function x() {};
    delete x;  // 函数无法删除报错
    
  • 不允许定义重复的形参

    "use strict";
    function x(p1, p1) {}; // 形参重复报错
    
  • 不支持八进制数字字面表达式

    "use strict";
    var x = 010;  // 字面量八进制数报错
    
  • 不允许转义字符

    "use strict";
    var x = \010;  // 转义字符报错
    
  • 不允许写只读属性

    "use strict";
    var obj = {};
    Object.defineProperty(obj, "x", {value:0, writable:false});
    
    obj.x = 3.14;    // 只读不可写,报错
    
  • 不允许写只能get的属性

    "use strict";
    var obj = {get x() {return 0} };
    
    obj.x = 3.14;      // x属性之定义了getter,没有setter,报错
    
  • 不允许删除一个不可删属性

    "use strict";
    delete Object.prototype; // prototype不可删,报错
    
  • eval字符串不能作为变量名

    "use strict";
    var eval = 3.14; // eval不可定义为变量,报错
    
  • 不能定义arguments变量

    "use strict";
    var arguments = 3.14; // 不能定义arguments变量,报错
    
  • 不可使用with

    "use strict";
    with (Math){x = cos(2)}; // 不可使用with,报错
    
  • 出于安全原因考虑,eval语句不允许创建变量

    "use strict";
    eval ("var x = 2");
    alert (x);  // 报错,未定义
    
  • 在严格模式的函数中的this将会变为undefined而不是window或者其他全局对象

    "use strict";
    function a(){console.log(this)}
    a() // undefined
    
  • 前瞻性考虑

    严格模式中一些将来可能用到的新增关键字将不允许使用:

    • implements
    • interface
    • let
    • package
    • private
    • protected
    • public
    • static
    • yield

注意事项

“use strict”必须在脚本或者函数的最上方定义,不然浏览器将不会解析为严格模式.

参考文献地址

w3schools