1. 程式人生 > >ES5嚴格模式(use strict)筆記

ES5嚴格模式(use strict)筆記

 

嚴格模式就是讓js程式碼在更嚴格的環境下執行。

目的:

  1. 消除JavaScript語法的不嚴謹和不合理之處,減少怪異行為。
  2. 消除程式碼執行的不安全之處,保證程式碼的執行安全。
  3. 提高編譯器的效率,增加編譯速度。
  4. 為未來新版本的Javascript做好鋪墊。

同樣的程式碼,在"嚴格模式"中,可能會有不一樣的執行結果;一些在"正常模式"下可以執行的語句,在"嚴格模式"下將不能執行。

進入嚴格模式的標誌是下面語句,老版本不支援的瀏覽器就會忽略此語句:

“use strict”;

嚴格模式的幾種呼叫方式:

  1. 放在指令碼檔案的第一行,整個指令碼檔案就會以嚴格模式執行,如果不在第一行,指令碼檔案將以正常模式執行。
  2. 放在函式內部第一行,整個函式就會以嚴格模式執行。
  3. 第一種方法不利於檔案合併的情況,可以呼叫第二種方法,將指令碼檔案都放到一個匿名函式內執行。
(function () {
    "use strict";
    // some code here
})

嚴格模式對JavaScript的語法和行為都做了一些改變

  1. 全域性變數要顯式宣告,不然會報錯。
  2. 靜態繫結,JavaScript是允許動態繫結的,屬性和方法屬於哪個物件在執行時確定,不在編譯時確定。嚴格模式對動態繫結做了一些限制,只允許靜態繫結,屬性和方法屬於哪個物件需要在編譯時就要確定,這樣做有利於編譯效率的提高,程式碼更容易閱讀。
  • 禁止使用with語句。因為with語句語法在編譯時確定屬性屬於哪個物件。
  • 建立eval作用域。正常模式下,Javascript語言有兩種變數作用域(scope):全域性作用域和函式作用域。嚴格模式創設了第三種作用域:eval作用域。正常模式下,eval語句的作用域,取決於它處於全域性作用域,還是處於函式作用域。嚴格模式下,eval語句本身就是一個作用域,不再能夠生成全域性變量了,它所生成的變數只能用於eval內部。

增強的安全措施

  1. 禁止this指向全域性作用域。
  2. 禁止在函式內部遍歷呼叫棧
  3. 禁止刪除變數:嚴格模式下將不能刪除變數,只有configurable設定為true的才能刪除。
  4. 顯式報錯。
  5. 重名錯誤。物件不能有重名的屬性、函式不能有重名的引數。
  6. 禁止八進位制表示法。
  7. arguments物件的限制:1、不允許對arguments賦值。2、不再追蹤引數的變化。3、禁止使用arguments.callee,無法在匿名函式中呼叫自身了
  8. 函式必須宣告在頂層
  9. 增加了一些保留字,用這些保留字命名變數將會報錯。implements, interface, let, package, private, protected, public, static, yield。
function f1(){

    "use strict";

    f1.caller; // 報錯

    f1.arguments; // 報錯

  }

f1();

 參考:阮一峰的網路日誌   http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html