经典面试题(11):关于变量提升,以下代码将输出什么?
看下面的代碼,輸出的結(jié)果是什么?并解釋你的答案。
function test() {
? console.log(a);
? console.log(foo());
?
? var a = 1;
? function foo() {
? ? ?return 2;
? }
}
?
test();//輸出的結(jié)果是什么?
答案
這段代碼的執(zhí)行結(jié)果是undefined?和2。
導(dǎo)致這個(gè)結(jié)果的原因是:變量和函數(shù)都被提升到了函數(shù)體的頂部。
什么叫提升?是這樣子的,Js代碼的編譯階段會(huì)找到所有的聲明,包括變量聲明var a和函數(shù)聲明function foo(){}在內(nèi)的所有聲明都會(huì)在代碼被執(zhí)行前的編譯階段首先被處理,就好像變量聲明和函數(shù)聲明從他們代碼中出現(xiàn)的位置被移動(dòng)到執(zhí)行環(huán)境的頂部,這個(gè)過程就叫做提升。
需要注意的是:只有聲明操作會(huì)被提升,賦值和邏輯操作會(huì)被留在原地等待執(zhí)行。
因此,當(dāng)打印變量a時(shí),由于變量提升的原因,它已經(jīng)被聲明了,所以這個(gè)時(shí)候去訪問變量a并不會(huì)報(bào)錯(cuò)。但它只是被聲明了,未被賦值(賦值出現(xiàn)在打印之后再執(zhí)行),所以它的值是undefined。
換言之,上面的代碼其實(shí)是等同于下面的代碼:
function test() {
? var a;//提升到執(zhí)行環(huán)境頂部
? function foo() {
? ? ?return 2;
? }
?
? console.log(a);
? console.log(foo());
?
? a = 1;
}
?
test();
熱門文章
原創(chuàng)教程原創(chuàng)教程:
附加習(xí)題:
職場(chǎng)焦慮:
感到迷茫:
培訓(xùn)出身:
培訓(xùn)費(fèi)用:
搞笑黑話:
職業(yè)自由:
職場(chǎng)形象:
總結(jié)
以上是生活随笔為你收集整理的经典面试题(11):关于变量提升,以下代码将输出什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云炬随笔20211012(1)
- 下一篇: 经典面试题(2):下面的代码将输出什么到