add() // 0
function add () {
return '函數聲明'
}
複製代碼
add () // add is not a function
var add = function () {
return '函數表達式'
}
複製代碼
以上兩個例子中,第一段代碼中函數聲明式add存在變量提高,實際上的執行順序爲:bash
var add
add()
function add () {
return '函數聲明'
}
複製代碼
很好奇的是爲何一樣都是函數,第二段函數表達式中彷佛沒有進行函數變量提高,再看一個例子:函數
var add = function () {
return 1
}
add() // 1
複製代碼
實際上,函數表達式定義後,並不會進行變量提高,只是會在執行的時候運行,因此纔會出現此種狀況。ui
var add = function () {
return 0
}
function add () {
return 1
}
add() // 0
複製代碼
這裏實際上也是存在變量提高的,只不過是兩種類型的提高,一種是var變量提高,一種是function提高,在運行以前,會提早生成執行上下文,執行上下文解析的規則則是:function早於var被提高,因此上例就很好理解了,是由於變量add覆蓋了函數add。spa
總結了如下幾點:code