console.log(a); //
案例二
function a() {}; var a=3; console.log(a);//
為什么兩者輸出不一樣呢?
解析:
針對案例一
其執(zhí)行流程可以細(xì)化為
1.首先會申請一個空間,開始申明函數(shù)a,然后在執(zhí)行申明變量a,發(fā)現(xiàn)已經(jīng)有a的聲明,于是不進(jìn)行申明
2.然后,就執(zhí)行console.log(a);即輸出函數(shù)a
3.最后執(zhí)行在執(zhí)行賦值操作,將a=3,這時候函數(shù)a就被轉(zhuǎn)為變量類型,并賦值為3。為了驗(yàn)證,可以將程序改為如下
a(); function a() { console.log(5); }; var a=3; a();
可以發(fā)現(xiàn)程序執(zhí)行結(jié)果如下:
因?yàn)樵谫x值之前,a仍然是函數(shù),當(dāng)執(zhí)行賦值語句后,a變?yōu)?了,執(zhí)行a()就會報錯。
針對案例二
同理可以知,首先申明了函數(shù)a,然后在執(zhí)行申明變量a,發(fā)現(xiàn)已經(jīng)有a的聲明,于是不進(jìn)行申明,接下來,執(zhí)行了賦值語句,將函數(shù)a轉(zhuǎn)為變量。最后輸出變量a的值
總結(jié):
1)函數(shù)被申明的優(yōu)先級高于變量
2)被聲明過的變量名或是函數(shù)名不會被重復(fù)申明
3)變量和賦值語句一起書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置
補(bǔ)充
1.下面代碼執(zhí)行結(jié)果為
var x=0; f(); console.log(x); var f=function(){ x=1; } f(); console.log(x); function f(){ x=2; } f(); console.log(x);
答案:2 1 1
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com