js代碼執(zhí)行前迂烁,會(huì)有一個(gè)預(yù)編譯過程看尼,該過程主要進(jìn)行以下操作:語法檢查,和聲明提升盟步。
聲明提升藏斩,又分為兩部分:變量聲明提升和函數(shù)聲明提升。
聲明提升的主要表現(xiàn):先使用后聲明却盘。
變量聲明提升:在當(dāng)前代碼塊執(zhí)行前狰域,所有變量聲明會(huì)在預(yù)編譯階段提前完成,所有變量被賦值為undefined黄橘,可以理解為變量提前創(chuàng)建兆览。
console.log(num);//undefined
var num = 100;
/*以上代碼可以理解為:
var num;
console.log(num);
num = 100;
*/
函數(shù)聲明提升:函數(shù)對(duì)象在預(yù)編譯階段,已經(jīng)完全創(chuàng)建完畢塞关,可以隨時(shí)使用抬探。函數(shù)聲明提升高于變量聲明。
fn();
?function fn(){
?????console.log("我被提前創(chuàng)建完成帆赢!")//我被提前創(chuàng)建完成小压!
}
//同時(shí)聲明變量a和函數(shù)a
vara;
functiona() {}
alert(typeofa);//顯示的是"function",初步證明function的優(yōu)先級(jí)高于var椰于。
//先聲明函數(shù)后聲明變量怠益,證明上邊的例子不是function覆蓋了變量
functiona() {}
vara;
alert(typeofa);//顯示的仍是"function",而不是"undefined",即function的優(yōu)先級(jí)高于var瘾婿。
//聲明了變量的同時(shí)賦值
functiona() {}
vara = 1;
alert(typeofa);//number,此時(shí)不是function了蜻牢。
//說明:"var a=1"相當(dāng)于"var a;a=1",即先聲明烤咧,后賦值,"a=1"相當(dāng)于把a(bǔ)重新賦值了孩饼,自然就是number!
注意:if邏輯中聲明的函數(shù)髓削,不參與函數(shù)聲明提升,但是參與變量聲明提升镀娶;