js代碼執行前,會有一個預編譯過程,該過程主要進行以下操作:語法檢查,和聲明提升。
聲明提升,又分為兩部分:變量聲明提升和函數聲明提升。
聲明提升的主要表現:先使用后聲明。
變量聲明提升:在當前代碼塊執行前,所有變量聲明會在預編譯階段提前完成,所有變量被賦值為undefined,可以理解為變量提前創建。
console.log(num);//undefined
var num = 100;
/*以上代碼可以理解為:
var num;
console.log(num);
num = 100;
*/
函數聲明提升:函數對象在預編譯階段,已經完全創建完畢,可以隨時使用。函數聲明提升高于變量聲明。
fn();
?function fn(){
?????console.log("我被提前創建完成!")//我被提前創建完成!
}
//同時聲明變量a和函數a
vara;
functiona() {}
alert(typeofa);//顯示的是"function",初步證明function的優先級高于var。
//先聲明函數后聲明變量,證明上邊的例子不是function覆蓋了變量
functiona() {}
vara;
alert(typeofa);//顯示的仍是"function",而不是"undefined",即function的優先級高于var。
//聲明了變量的同時賦值
functiona() {}
vara = 1;
alert(typeofa);//number,此時不是function了。
//說明:"var a=1"相當于"var a;a=1",即先聲明,后賦值,"a=1"相當于把a重新賦值了,自然就是number!
注意:if邏輯中聲明的函數,不參與函數聲明提升,但是參與變量聲明提升;