ES6規範前後塊級作用域與函式宣告的纏纏綿綿

2021-09-11 15:42:29 字數 980 閱讀 1260

今天我們就以上面的這個例子來說一下,塊級作用域與函式宣告在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 呼叫函式 塊級作用域,允許函式可以在塊級作用域中宣告。在塊級作用...