JavaScript之「use strict」

JavaScript之「use strict」

「use strict"是ECMAScript 5引入的一條指令。
指令不是語句(但很是接近於語句)。「usestrict"指令和普通的語句之間有兩個重要的區別:前端

  1. 它不包含任何語言的關鍵字,指令僅僅是一個包含一個特殊字符串直接量的表達式(能夠是使用單引號也可使用雙引號),對於那些沒有實現ECMAScript 5的JavaScript解釋器來講,它只是一條沒有反作用的表達式語句,它什麼也沒作。未來的ECMAScript標準但願將use用作關鍵字,這樣就能夠省略引號了。
  2. 它只能出如今腳本代碼的開始或者函數體的開始、任何實體語句以前。但它沒必要一-定出如今腳本的首行或函數體內的首行,由於「use strict" 指令以後或以前均可能有其餘字符串直接量表達式語句,而且JavaScript的具體實現可能將它們解析爲解釋器自有的指令。在腳本或者函數體內第一條常規語句以後字符串直接量表達式語句只當作普通的表達式語句對待;它們不會當作指令解析,它們也沒有任何反作用。

使用「use strict" 指令的目的是說明(腳本或函數中)後續的代碼將會解析爲嚴格代碼(strict code)。若是頂層(不在任何函數內的)代碼使用了「use strict" 指令,那麼它們就是嚴格代碼。若是函數體定義所處的代碼是嚴格代碼或者函數體使用了「use strict"指令,那麼函數體的代碼也是嚴格代碼。若是eva1()調用時所處的代碼是嚴格代碼或者eval()要執行的字符串中使用了「scrict code」指令,則eval()內的代碼是嚴格代碼。數組

嚴格代碼以嚴格模式執行。ECMAScript 5中的嚴格模式是該語言的一個受限制的子集,它修正了語言的重要缺陷,並提供健壯的查錯功能和加強的安全機制。
嚴格模式和非嚴格模式之間的區別以下(前三條尤其重要) :安全

  • 在嚴格模式中禁止使用with語句。
  • 在嚴格模式中,全部的變量都要先聲明,若是給一個未聲明的變量、函數、函數參數、catch從句參數或全局對象的屬性賦值,將會拋出一個引用錯誤異常(在非嚴格模式中,這種隱式聲明的全局變量的方法是給全局對象新添加一一個新屬性)。
  • 在嚴格模式中,調用的函數(不是方法)中的一個this值是undefined。(在非嚴格模式中,調用的函數中的this值老是全局對象)。能夠利用這種特性來判斷JavaScript實現是否支持嚴格模式:app

    var hasstrictMode = (function() { "use strict"; return this==undefined}());
  • 一樣,在嚴格模式中,當經過call()或app1y()來調用函數時,其中的this值就是經過call()或apply()傳入的第一個參數(在非嚴格模式中,null和undefined值被全局對象和轉換爲對象的非對象值所代替)。
  • 在嚴格模式中,給只讀屬性賦值和給不可擴展的對象建立新成員都將拋出-一個類型錯誤異常(在非嚴格模式中,這些操做只是簡單地操做失敗,不會報錯)。
  • 在嚴格模式中,傳人eval()的代碼不能在調用程序所在的上下文中聲明變量或定義函數,而在非嚴格模式中是能夠這樣作的。相反,變量和函數的定義是在eval()建立的新做用域中,這個做用域在eval()返回時就棄用了。
  • 在嚴格模式中,函數裏的arguments對象(見8.3.2節) 擁有傳入函數值的靜態副本。在非嚴格模式中,arguments對象具備 「魔術般」的行爲,arguments 裏的數組元素和函數參數都是指向同一個值的引用。
  • 在嚴格模式中,當delete運算符後跟隨非法的標識符(好比變量、函數、函數參數)時,將會拋出一個語法錯誤異常(在非嚴格模式中,這種delete表達式什麼也沒作,並返回false)。
  • 在嚴格模式中,試圖刪除-一個不可配置的屬性將拋出一個類型錯誤異常(在非嚴格模式中,delete表達式操做失敗,並返回false)。
  • 在嚴格模式中,在一個對象直接量中定義兩個或多個同名屬性將產生-一個語法錯誤(在非嚴格模式中不會報錯)。
  • 在嚴格模式中,函數聲明中存在兩個或多個同名的參數將產生-一個語法錯誤(在非嚴格模式中不會報錯)。
  • 在嚴格模式中是不容許使用八進制整數直接量(以0爲前綴,而不是0x爲前綴)的(在非嚴格模式中某些實現是容許八進制整數直接量的)。
  • 在嚴格模式中,標識符eval和arguments 當作關鍵字,它們的值是不能更改的。不能給這些標識符賦值,也不能把它們聲明爲變量、用作函數名、用作函數參數或用作catch塊的標識符。
  • 在嚴格模式中限制了對調用棧的檢測能力,在嚴格模式的函數中,arguments.caller和arguments.callee都會拋出一個類型錯誤異常。嚴格模式的函數一樣具備caller和arguments屬性,當訪問這兩個屬性時將拋出類型錯誤異常(有一些JavaScript的實如今非嚴格模式裏定義了這些非標準的屬性)

我是Cloudy,年輕的前端攻城獅一枚,愛專研,愛技術,愛分享。
我的筆記,整理不易,感謝閱讀、點贊和收藏。
文章有任何問題歡迎你們指出,也歡迎你們一塊兒交流前端各類問題!
相關文章
相關標籤/搜索