亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于函數執行的問題

關于函數執行的問題

翻閱古今 2019-03-04 17:43:34
var a = 8;function a(){};console.log(a);為啥a不是function 而是8呢?
查看完整描述

2 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

問題很好,題主看起來也有過思考。

這個問題涉及兩個點,變量提升和函數聲明。

1.變量提升
js中的變量提升,提的是聲明。因此變量a只有聲明被提升了,初始化依然處于原位置。而函數a則整體都提升了。

2.函數聲明
對于function a(){},實際上分成了兩部分,一是聲明一個namea的函數,二是將這個函數賦給變量a

因此這段代碼的運行過程是這樣的
1.聲明函數a,根據上文,實際是var a = function (){}(函數名為a)。這里已經聲明了變量a并初始化
2.聲明變量a,由于之前已經聲明了a,因此這里會跳過聲明。相當于變量a的變量提升沒用了。
3.執行變量a的初始化,由于之前的聲明,這里實際上等同于變量a的賦值

因此最后打印的a為8


查看完整回答
反對 回復 2019-03-08
?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

你需要了解2個概念:


javascript具備"頭等函數(first-class function)"的特性,優先聲明并且不會被后面的聲明覆蓋(注意這里只是說聲明不會被覆蓋)

運行時構建對象(先聲明后賦值,可以理解為變量提升)

因此你的代碼在被引擎解析之后如下:


function a(){}// 此時a被聲明切賦值為函數

var a;// 此時的a依然是函數,因為函數是頭等公民

a = 8;// 此時賦值,覆蓋原來的函數

console.log(a);// 輸出a的值,也就是8


查看完整回答
反對 回復 2019-03-08
  • 2 回答
  • 0 關注
  • 511 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號