2 回答

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
問題很好,題主看起來也有過思考。
這個問題涉及兩個點,變量提升和函數聲明。
1.變量提升js
中的變量提升,提的是聲明。因此變量a
只有聲明被提升了,初始化依然處于原位置。而函數a
則整體都提升了。
2.函數聲明
對于function a(){}
,實際上分成了兩部分,一是聲明一個name
為a
的函數,二是將這個函數賦給變量a
。
因此這段代碼的運行過程是這樣的
1.聲明函數a
,根據上文,實際是var a = function (){}
(函數名為a
)。這里已經聲明了變量a
并初始化
2.聲明變量a
,由于之前已經聲明了a
,因此這里會跳過聲明。相當于變量a
的變量提升沒用了。
3.執行變量a
的初始化,由于之前的聲明,這里實際上等同于變量a
的賦值
因此最后打印的a為8

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
你需要了解2個概念:
javascript具備"頭等函數(first-class function)"的特性,優先聲明并且不會被后面的聲明覆蓋(注意這里只是說聲明不會被覆蓋)
運行時構建對象(先聲明后賦值,可以理解為變量提升)
因此你的代碼在被引擎解析之后如下:
function a(){}// 此時a被聲明切賦值為函數
var a;// 此時的a依然是函數,因為函數是頭等公民
a = 8;// 此時賦值,覆蓋原來的函數
console.log(a);// 輸出a的值,也就是8
添加回答
舉報
0/150
提交
取消