"use strict"

  1. 全局变量显示声明
  2. 静态绑定:属性和方法到底归属哪个对象,在编译阶段就确定。

    • 禁止使用with语句:因为with语句无法在编译时就确定属性到底归属哪个对象
    • 创设eval作用域:正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。它所生成的变量只能用于eval内部。
  3. 增强的安全措施

    • 禁止this关键字指向全局对象
      使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

      function f(){
          "use strict";
          this.a = 1;
      };
      f();// 报错,this未定义
    • 禁止在函数内部遍历调用栈

      function f1(){
          "use strict";
          f1.caller; // 报错
          f1.arguments; // 报错
         }
  4. 禁止删除变量:只有configurable设置为true的对象属性,才能被删除。
  5. 显示报错
    正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。

      "use strict";
      var o = {};
      Object.defineProperty(o, "v", { value: 1, writable: false });
      o.v = 2; // 报错

    严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。

      "use strict";
    
      var o = {
    
        get v() { return 1; }
      };
      o.v = 2; // 报错

    严格模式下,对禁止扩展的对象添加新属性,会报错。

      "use strict";
      var o = {};
      Object.preventExtensions(o);
      o.v = 1; // 报错

    严格模式下,删除一个不可删除的属性,会报错。

      "use strict";
      delete Object.prototype; // 报错
  6. 重名错误

    • 对象不能有重名的属性:正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
    • 函数不能有重名的参数:正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。
  7. 禁止八进制表示法:整数第一位为0,将报错。
  8. arguments对象的限制

    • 不允许对arguments赋值

      "use strict";
        arguments++; // 语法错误
        var obj = { set p(arguments) { } }; // 语法错误
        try { } catch (arguments) { } // 语法错误
        function arguments() { } // 语法错误
        var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
    • arguments不再追踪参数的变化

      function f(a) {

        return [a, arguments[0]];
      }
      f(1); // 正常模式为[2,2]
      function f(a) {
        "use strict";
        a = 2;
        return [a, arguments[0]];
      }
       f(1); // 严格模式为[2,1]

    - 禁止使用arguments.callee
    这意味着,你无法在匿名函数内部调用自身了。

      "use strict";
      var f = function() { return arguments.callee; };
      f(); // 报错

  9. 函数必须声明在顶层
    将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

  if (true) {
    function f() { } // 语法错误
  }
  for (var i = 0; i < 5; i++) {
    function f2() { } // 语法错误
  }

 10. 保留字
 严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。使用这些词作为变量名将会报错。

原文链接:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html


    

lhm_582082005a5e6
130 声望1 粉丝