在js中,經過var
聲明的變量,不管在何處申明,都會被視爲聲明於所在函數的頂部(若是不在函數內,則視爲全局做用域頂部)。申明會提高,初始化不會提高。
例如:當咱們單獨執行console.log(a)
時,代碼會產生異常,由於a沒有定義。
可是在後面加上var a = 123
,執行結果輸出undefined
js執行分兩個步驟:函數
這裏起做用的就是變量提高,編譯後的代碼至關於
爲何輸出的不是123呢?由於初始化不會提高,因此a = '123' 不會提高至頂部。
注意的是,這裏的聲明都是經過var
申明的。使用let
或const
聲明的變量,在達到聲明處以前都是沒法訪問的,試圖訪問會致使一個引用錯誤。let
與 const
必需先申明再引用,而且只會做用於當前代碼塊內部(函數內部、大括號內部、for循環內部)。一般建議變量申明優先使用const
,而後再使用let
spa
function
函數聲明會被提高到當前做用域 的最前面。例如,在下面例子中test函數被提高至頂部:
但對於經過表達式申明的函數不會提高,以下:
test變量提高了,但初始化不會提高。code
資料:《深刻理解ES6》第一章ip