今天我們就以上面的這個例子來說一下,塊級作用域與函式宣告在es6前後的糾葛,當然在es6之前是沒有塊級作用域的,但為了與es6統一,使文章更簡明,所以把這對『{}』統一稱為塊級作用域。
開正題之前,還是要說一下,因為塊級作用域與函式宣告之間的這種變化,所以應該盡量避免使用。若需要,可以使用函式表示式代替。
一、es6之前由於函式宣告會提公升至全域性作用域或函式作用域頂部,所以上面的**無法達到程式設計人員的預期效果,因為前面的函式宣告會被後面的覆蓋,所以呼叫f(),始終列印數字2;(這裡還是要囉嗦一下,為了文章簡潔,我簡單的把語法規範劃為了兩部分,但在es5規範中是不允許在「塊級作用域」中進行函式的宣告的,可是若瀏覽器遵循此規範,會影響大批舊**,所以瀏覽器廠商並未遵循此規範)。
二、es6之後,規範中規定可以在塊級作用域中進行函式宣告,並且不會在作用域外訪問到,此規範下編寫上面的**,完全符合程式設計人員的需求,但最大的問題還是向後相容。所以在es6規範的附錄中規定,瀏覽器可以不遵守規範,有自己的行為。
三、現如今瀏覽器對塊級作用域與函式宣告之間的行為,也就是es6附錄中的規範:
1、允許在塊級作用域內宣告函式
2、函式宣告類似於var,即會提公升至全域性作用域或函式作用域的頭部
3、函式宣告還會提公升到所在塊級作用域的頭部
我們結合例子來解讀一下上面的三條規範,函式f會只將函式名提公升至全域性作用域,不會提公升函式體。這樣若在判斷語句之前呼叫f();會出現「f is not a function」的錯誤。
類似於var,只會提公升定義,並不會提公升賦值。
至於第三句規範,也就是說在塊級作用域內函式還是按照es6之前那樣,函式宣告與函式體一塊提公升。
這樣的行為,也讓上面的**實現了程式設計人員的本來想法。
綜合來說,就是說es6之前,函式全部提公升;es6之後,瀏覽器環境內函式提公升一半,但其他環境還是按照es6的本意實現真正的塊級作用域。
es6 塊級作用域用法
iife 寫法 function 塊級作用域寫法 塊級作用域的出現,實際上使得獲得廣泛應用的立即執行函式表示式 iife 不再必要了。function f function f 上面 在 es5 jscript不支援塊級作用域環境中執行,會得到 i am inside 因為在 if內宣告的函式f會被...
ES6的塊級作用域
為什麼要使用塊級作用域?1.在預編譯階段,變數的宣告會被提公升到作用域頂部,而初始化操作依舊留在原處執行,在該作用域中未定義變數的地方也能訪問到該變數,但是此時變數尚未初始化,所以其值為undefined,為此es6引入塊級作用域來強化對變數生命週期的控制 塊級宣告 1.塊級作用域用於宣告在指定塊的...
ES6的塊級作用域
let為j ascript新增了塊級作用域,外層作用域無法獲取到內層作用域,這樣非常安全。即使外層和內層都使用相同變數名,也都互不干擾。例如 1 function test 7 console.log a 輸出 18 910 test 呼叫函式 塊級作用域,允許函式可以在塊級作用域中宣告。在塊級作用...