咳咳
作為一名JSer,說到“變量提升”,我們都很熟悉。曾經(jīng)我也以為是這樣,直到今天去百度面試,在這個問題上狠狠的栽了個跟頭。
關(guān)于JSer都很熟悉的簡單例子
- 變量提升
console.log(foo)
var foo = function {
console.log('hello world')
}
這是一個很簡單的例子,大家應(yīng)該很快能反應(yīng)過來,輸出的是undefined。
- 函數(shù)提升
foo()
function foo () {
console.log('hello world')
}
這是也一個很簡單的例子,大家應(yīng)該很快能反應(yīng)過來,foo函數(shù)是可以完美執(zhí)行的。
今天令我栽跟頭的題目
// ... 假裝這里有很多不相關(guān)代碼
var a = function () {
console.log(1)
}
function a() {
console.log(2)
}
a()
輸出啥?
如果對上面那兩個例子非常熟悉,其實這一題應(yīng)該是能給出答案的。
函數(shù)表達式的例子,我們可以改寫為:
var a // 聲明變量的操作被提升到最前面
// ... 假裝這里有很多不相關(guān)代碼
a = function {
console.log(1)
}
a()
如上,a變量的聲明被提前到了作用域的最前面,執(zhí)行到對應(yīng)處,再給a賦值。
舉一反三的話?函數(shù)聲明的例子怎么改呢?
舉一反三的話,就一定錯了。因為舉著一個西瓜,是反不出一個蘋果的。
function foo () {
console.log('hello world')
}
// ... 假裝這里有很多不相關(guān)代碼
foo()
對于函數(shù)聲明的提升,提升不僅僅是函數(shù)聲明,而是這個函數(shù)的所有。我們總是把變量提升掛在嘴邊,誤以為變量聲明提升(函數(shù)表達式本質(zhì)也是一個變量聲明)和函數(shù)聲明提升是一回事,卻忽視了重要的整體提升概念。
所以綜合以上,可以把這道的面試題改下如下:
var a
function a() {
console.log(2)
}
// ... 假裝這里有很多不相關(guān)代碼
a = function () {
console.log(1)
}
a()
改寫成這樣的話,我想應(yīng)該沒有人會不知道輸出什么吧?
很可惜,機會是留給有準備的人,我錯過了一次好機會
原文首發(fā)于我的博客:https://www.vq0599.com/p/34
轉(zhuǎn)載請注明出處