1. 程式人生 > >"use strict" 的意義和好處

"use strict" 的意義和好處

ES6的模組自動採用嚴格模式,不管你有沒有在模組頭部加上"use strict"

嚴格模式主要有以下限制:

  • 變數必須聲明後再使用
  • 函式的引數不能有同名屬性,否則報錯
  • 不能使用with語句
  • 不能對只讀屬性賦值,否則報錯
  • 不能使用字首0表示八進位制數,否則報錯
  • 不能刪除不可刪除的屬性,否則報錯
  • 不能刪除變數delete prop ,會報錯,只能刪除屬性 selete global[prop]
  • eval 不會在它的外層作用域引入變數
  • eval和arguments不能被重新賦值
  • arguments不會自動反映函式引數的變化
  • 不能使用arguments.callee
  • 不能使用arguments.caller
  • 禁止this指向全域性物件
  • 不能使用fn.caller和fn.arguments獲取函式呼叫的堆疊
  • 增加了保留字(比如protected、static和interface)

上面這些限制,模組都必須遵守。由於嚴格模式是ES5引入的不屬於ES6所以請參閱ES5書籍

其中,尤其需要注意this的限制。ES6模組之中,頂層的this指向undefined,即不應該在頂層程式碼使用this。

這裡最簡單也是最重要的答案是 use strict 是一種執行時自動執行更嚴格的JavaScript程式碼解析和錯誤處理的方法。如果程式碼錯誤被忽略或失敗,將會產生錯誤或丟擲異常。總的來說,這是一個很好的做法。

嚴格模式的一些主要有點包括:

使除錯跟更容易。如果程式碼錯誤本來會被忽略或失敗,那麼現在將會產生錯誤或丟擲異常,從而更快地發現程式碼中的問題,並更快地指引它們的原始碼。

防止意外全域性。如果沒有嚴格模式,將指賦值給未宣告的變數會自動建立一個具有該名稱的全域性變數。這是JavaScript中最常見的錯誤之一。在嚴格模式下,嘗試這樣做會引發錯誤。

消除隱藏威脅。在沒有嚴格模式的情況下,對null或undefined的這個值得引用會自動強制到全域性。這可能會導致需要headfakes和pull-out-your-hair型別的錯誤。在嚴格模式下,因公用null或undefined的這個值會引發錯誤。

不允許重複的引數值。嚴格模式在檢測到函式的重複命名引數(例如,函式foo(var1,var2,var1){})時會引發錯誤,從而捕獲程式碼中幾乎可以肯定存在的錯誤,否則您可能會浪費大量的時間追蹤。

注意:它曾經是(ECMAScript 5 中)strict模式將禁止重複的屬性名稱(例如var object = {foo:“bar”,foo:“baz”};)但是從ECMAScript 2015 開始,就不再有這種情況了。

使eval()更安全。eval()在嚴格模式和非嚴格模式下的行為方式有些不同。最重要的是,在嚴格模式下,在eval()語句內部宣告的變數和函式不會再包含範圍中建立(它們是以非嚴格模式在包含範圍中建立的,這也可能是問的常見來源)。

丟擲無效的使用錯誤的刪除符。刪除操作符(用於從物件中刪除屬性)不能用於物件的不可配置屬性,當試圖刪除一個不可配置的屬性時,非嚴格程式碼將自動失敗,而在這種情況下,嚴格模式會引發錯誤