1.什麼是嚴格模式?
ECMAScript 5包括兩種執行模式:正常模式和嚴格模式。嚴格模式,‘use strict’,是的JavaScript在更嚴格的條件下執行。
2.為什麼使用嚴格模式?

1)消除JavaScript語法一些不嚴謹不合理的地方,減少怪異行為,更方便小白查詢bug。

2)提高編譯效率,增加執行速度。

3)提高了安全性。

4)適用於大型專案開發。

3.如何使用嚴格模式?

'use strict';

4.你能用嚴格模式做什麼?

1)正常模式,如果一個變數沒有宣告就賦值,預設是全域性變數。嚴格模式禁止該用法,全域性變數必須使用var顯式宣告再使用。

2)JavaScript 語言的一個特點,就是允許"動態繫結",即某些屬性和方法到底屬於哪一個物件,不是在編譯時確定的,而是在執行時(run time)確定的。嚴格模式對動態繫結做了一些限制。某些情況下,只允許靜態繫結。也就是說,屬性和方法到底歸屬哪個物件,在編譯階段就確定。這樣做有利於編譯效率的提高,也使得程式碼更容易閱讀,更少出現意外。

3)增強安全性。

  1. 禁止使用this關鍵字指向全域性物件
    function f(){
        return !this;
      } 
      // 返回false,因為"this"指向全域性物件,"!this"就是false
    
      function f(){ 
        "use strict";
        return !this;
      } 
      // 返回true,因為嚴格模式下,this的值為undefined,所以"!this"為true。
    使用建構函式時,如果忘記加new,this不指向全域性物件而是報錯。
     function f(){
    
        "use strict";
    
        this.a = 1;
    
      };
    
      f();// 報錯,this未定義


  2. 禁止函式內部遍歷呼叫棧
      function f1(){
    
        "use strict";
    
        f1.caller; // 報錯
    
        f1.arguments; // 報錯
    
      }
    
      f1();

  3. 禁止刪除變數
    "use strict";
    
      var x;
    
      delete x; // 語法錯誤
    
      var o = Object.create(null, {'x': {
          value: 1,
          configurable: true
      }});
    
      delete o.x; // 刪除成功

  4. 顯式報錯  正常模式下,對一個物件的只讀屬性進行賦值,不會報錯,只會默默失敗。嚴格模式,將報錯。
     "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; // 報錯
  5. 重名錯誤   1) 物件不能有重名的屬性,正常模式下,如果物件有多個重名的屬性,後面覆蓋前面的值。嚴格模式,屬於語法錯誤
     "use strict";
    
      var o = {
        p: 1,
        p: 2
      }; // 語法錯誤
    2)函式不能有重名引數 正常模式下,若函式有多個重名引數,可以用arguments[i]讀取。嚴格模式,屬於語法錯誤。
     "use strict";
    
      function f(a, a, b) { // 語法錯誤
    
        return ;
    
      }

  6. 禁止八進位制表示法 正常模式,整數的第一位若為0,表示這是八進位制數,如0100等於十進位制64.嚴格模式禁止這種表示法。
     "use strict";
    
      var n = 0100; // 語法錯誤
  7. 函式宣告必須在頂層 嚴格模式只允許在全域性作用域或函式作用域的頂層宣告函式。不允許在非函式的程式碼塊內宣告函式。
    'use strict'
    if(true){
         function f(){}//語法錯誤
    }
    for (var i=0;i<5;i++){
        function f2(){}//語法錯誤
    }
  8. 新增保留字:implements,interface,let,package,private,protected,public,static,yield.使用這些詞作為變數名會報錯。此外,ECMAScript 第五版本身還規定了另一些保留字(class, enum, export, extends, import, super),以及各大瀏覽器自行增加的const保留字,也是不能作為變數名的

     function package(protected) { // 語法錯誤
    
        "use strict";
    
        var implements; // 語法錯誤
    
      }