js 嚴格模式

簡單整理一下js嚴格模式下的變化。整理來源MDN

部分代碼測試環境:Chrome 76.0.3809.132

將過失錯誤轉成異常

  • 嚴格模式下無法再意外創建全局變量。
"use strict";
mistypedVaraible = 17; // 這一行代碼就會拋出 ReferenceError。不可以不寫聲明
  • 嚴格模式下會使引起靜默失敗的賦值操作拋出異常。(包括但不限於,給不可寫屬性賦值,給只讀屬性賦值,給不可擴展對象的新屬性賦值)
  • 試圖刪除不可刪除屬性時會拋出異常(之前這種操作不會產生任何效果)
  • Gecko在版本34之前,嚴格模式下一個對象內的屬性重名會報錯。現在已經修復,即在嚴格模式下可以重名。
  • 嚴格模式下要求函數的參數名唯一。
  • 嚴格模式下禁止使用八進制數字語法。
  • ECMAScript 6中的嚴格模式禁止對primitive(目前(第三階段)新增加了bigInt基礎類型)類型設置屬性

簡化變量的使用

  • 禁用with
  • 嚴格模式下的 eval 不再爲上層範圍(surrounding scope,注:包圍eval代碼塊的範圍)引入新變量
    = 嚴格模式禁止刪除變量聲明。(注:依然可刪除對象屬性)

讓eval和arguments變的簡單

  • 名稱eval和arguments不能通過程序語法被綁定或賦值
  • 嚴格模式下,參數的值不會隨着arguments對象的值的改變而改變。
  • 不再支持arguments.callee

“安全的”Javascript

  • 在嚴格模式下通過this傳遞給一個函數的值不會被強制轉換爲一個對象
  • 在嚴格模式中再也不能通過廣泛實現的ECMAScript擴展“遊走於”JavaScript的棧中。如果fun在嚴格模式下,那麼fun.caller和fun.arguments都是不可刪除的屬性而且在存值、取值時都會報錯
  • 嚴格模式下的arguments不會再提供訪問與調用這個函數相關的變量的途徑。

爲未來的ECMAScript版本鋪平道路

  • 在嚴格模式中一部分字符變成了保留的關鍵字。這些字符包括implements, interface, let, package, private, protected, public, static和yield。
  • 嚴格模式禁止了不在腳本或者函數層面上的函數聲明


瀏覽器的嚴格模式

主流瀏覽器現在實現了嚴格模式。但是不要盲目的依賴它,因爲市場上仍然有大量的瀏覽器版本只部分支持嚴格模式或者根本就不支持(比如IE10之前的版本)。嚴格模式改變了語義。依賴這些改變可能會導致沒有實現嚴格模式的瀏覽器中出現問題或者錯誤。謹慎地使用嚴格模式,通過檢測相關代碼的功能保證嚴格模式不出問題。最後,記得在支持或者不支持嚴格模式的瀏覽器中測試你的代碼。如果你只在不支持嚴格模式的瀏覽器中測試,那麼在支持的瀏覽器中就很有可能出問題,反之亦然。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章