"use strict"

"use strict"

  1. 全局變量顯示聲明
  2. 靜態綁定:屬性和方法到底歸屬哪一個對象,在編譯階段就肯定。javascript

    • 禁止使用with語句:由於with語句沒法在編譯時就肯定屬性到底歸屬哪一個對象
    • 創設eval做用域:正常模式下,Javascript語言有兩種變量做用域(scope):全局做用域和函數做用域。嚴格模式創設了第三種做用域:eval做用域。它所生成的變量只能用於eval內部。
  3. 加強的安全措施html

    • 禁止this關鍵字指向全局對象
      使用構造函數時,若是忘了加new,this再也不指向全局對象,而是報錯。java

      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方法讀取的屬性進行賦值,會報錯。this

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

    嚴格模式下,對禁止擴展的對象添加新屬性,會報錯。prototype

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

    嚴格模式下,刪除一個不可刪除的屬性,會報錯。code

      "use strict";
      delete Object.prototype; // 報錯
  6. 重名錯誤htm

    • 對象不能有重名的屬性:正常模式下,若是對象有多個重名屬性,最後賦值的那個屬性會覆蓋前面的值。嚴格模式下,這屬於語法錯誤。
    • 函數不能有重名的參數:正常模式下,若是函數有多個重名的參數,能夠用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
相關文章
相關標籤/搜索