1. 程式人生 > >js中的嚴格模式和非嚴格模式的比較

js中的嚴格模式和非嚴格模式的比較

全局變量 賦值 cat 範圍 瀏覽器 進制 函數調用 使用 err

前言

es5的嚴格模式是采用具有限制性JavaScript變體的一種方式,從而使代碼顯示地脫離‘懶散模式/非嚴格模式’

嚴格模式

  1. 嚴格模式通過拋出錯誤來消除一些原有靜默錯誤

  2. 嚴格模式修復了一些導致JavaScript引擎難以優化的缺陷:有時候,相同的代碼,嚴格模式可以比非嚴格模式下運行得更快。

  3. 嚴格模式禁用了在ECMAScript未來版本中可能會定義的一些語法。

開啟嚴格模式

在整個腳本文件或者函數體開頭,寫入‘use strict‘語句。

將拼寫錯誤轉成異常

  1. 無法再意外創建全局變量,會拋出錯誤。ReferenceError.: *** is not defined

  2. 引起靜默失敗的賦值操作拋出異常。 TypeError: ...

  3. 試圖刪除不可刪除的屬性時會拋出異常。TypeError: ...

  4. 要求函數的參數名唯一。SyntaxError: Duplicate parameter name not allowed in this context

  5. 禁止八進制數字語法。SyntaxError: Octal literals are not allowed in strict mode.

  6. 禁止設置原始類型值的屬性。TypeError: ...

簡化變量的使用

  1. 禁用with

  2. eval不再為上層範圍引入新變量。

    在嚴格模式下eval僅僅為被運行的代碼創建變量。所以eval不會使得名稱映射到外部變量或者其他局部變量。

  3. 禁止刪除聲明變量。delete name

    在嚴格模式下會引起語法錯誤。SyntaxError: Delete of an unqualified identifier in strict mode.

evalarguments變的簡單

  1. evalarguments不能通過程序語法被綁定賦值。

  2. 參數的值不會隨arguments對象的值的改變而變化。

  3. 不再支持argument.callee

“安全的”JavaScript

  1. 通過this傳遞給一個函數的值不會被強制轉換為一個對象。

  2. 再也不能通過廣泛實現的ECMAScript擴展“遊走於”JavaScript的棧中。

  3. 函數的參數不在提供對相應函數調用變量的訪問。

為未來的ECMAScript版本鋪平道路

  1. 保留了一部分字符作為關鍵字。比如implements,interface,let,package,private,protected,public,staticyield

  2. 禁止了不在腳本或者函數層面上的函數聲明

瀏覽器的嚴格模式

主流瀏覽器現在實現了嚴格模式。但是也有大量瀏覽器只支持部分嚴格模式或者根本就不支持,所以不要盲目依賴嚴格模式。

參考MDN

js中的嚴格模式和非嚴格模式的比較