鍍金池/ 問答/HTML/ 關(guān)于函數(shù)執(zhí)行的問題

關(guān)于函數(shù)執(zhí)行的問題

var a = 8;
function a(){};
console.log(a);

為啥a不是function 而是8呢?

回答
編輯回答
毀憶

你需要了解2個(gè)概念:

  1. javascript具備"頭等函數(shù)(first-class function)"的特性,優(yōu)先聲明并且不會(huì)被后面的聲明覆蓋(注意這里只是說聲明不會(huì)被覆蓋)
  2. 運(yùn)行時(shí)構(gòu)建對(duì)象(先聲明后賦值,可以理解為變量提升)

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

function a(){}// 此時(shí)a被聲明切賦值為函數(shù)
var a;// 此時(shí)的a依然是函數(shù),因?yàn)楹瘮?shù)是頭等公民
a = 8;// 此時(shí)賦值,覆蓋原來的函數(shù)
console.log(a);// 輸出a的值,也就是8
2017年1月6日 17:30
編輯回答
薄荷糖

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

這個(gè)問題涉及兩個(gè)點(diǎn),變量提升和函數(shù)聲明。

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

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

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

因此最后打印的a為8

2017年5月22日 13:55