js中的嚴格模式和非嚴格模式的比較
前言
es5的嚴格模式是采用具有限制性JavaScript變體的一種方式,從而使代碼顯示地脫離‘懶散模式/非嚴格模式’
嚴格模式
嚴格模式通過拋出錯誤來消除一些原有靜默錯誤
嚴格模式修復了一些導致JavaScript引擎難以優化的缺陷:有時候,相同的代碼,嚴格模式可以比非嚴格模式下運行得更快。
嚴格模式禁用了在ECMAScript未來版本中可能會定義的一些語法。
開啟嚴格模式
在整個腳本文件或者函數體開頭,寫入‘use strict‘
語句。
將拼寫錯誤轉成異常
無法再意外創建全局變量,會拋出錯誤。
ReferenceError.: *** is not defined
引起靜默失敗的賦值操作拋出異常。
TypeError: ...
試圖刪除不可刪除的屬性時會拋出異常。
TypeError: ...
要求函數的參數名唯一。
SyntaxError: Duplicate parameter name not allowed in this context
禁止八進制數字語法。
SyntaxError: Octal literals are not allowed in strict mode.
禁止設置原始類型值的屬性。
TypeError: ...
簡化變量的使用
禁用
with
eval
不再為上層範圍引入新變量。在嚴格模式下
eval
僅僅為被運行的代碼創建變量。所以eval
不會使得名稱映射到外部變量或者其他局部變量。禁止刪除聲明變量。
delete name
SyntaxError: Delete of an unqualified identifier in strict mode.
讓eval
和arguments
變的簡單
eval
和arguments
不能通過程序語法被綁定賦值。參數的值不會隨
arguments
對象的值的改變而變化。不再支持
argument.callee
“安全的”JavaScript
通過
this
傳遞給一個函數的值不會被強制轉換為一個對象。再也不能通過廣泛實現的ECMAScript擴展“遊走於”JavaScript的棧中。
函數的參數不在提供對相應函數調用變量的訪問。
為未來的ECMAScript版本鋪平道路
保留了一部分字符作為關鍵字。比如
implements
,interface
,let
,package
,private
,protected
,public
,static
和yield
禁止了不在腳本或者函數層面上的函數聲明
瀏覽器的嚴格模式
主流瀏覽器現在實現了嚴格模式。但是也有大量瀏覽器只支持部分嚴格模式或者根本就不支持,所以不要盲目依賴嚴格模式。
參考MDN
js中的嚴格模式和非嚴格模式的比較