為啥要進行變量提升和函數提升?
引擎在讀取js代碼的過程中,分為兩步。第一個步驟是整個js代碼的解析讀取,第二個步驟是執行。
在JS代碼執行之前,瀏覽器的解析器在遇到 var 變量名 和function 整個函數 提升到當前作用域的最前面。
記住兩句話
1.變量提升只會提升變量名的聲明,而不會提升變量的賦值初始化。
2.函數提升的優先級大於變量提升的優先級,即函數提升在變量提升之上。
記住這兩句話,就可以從容不迫的擼代碼了!
console.log(a); var a=1; console.log(a); function a(){console.log(2);} console.log(a); var a=3; console.log(a); function a(){console.log(3);} a(); console.log(a);
你知道執行結果嗎?
其實,實際的執行順序為:
function a(){alert(3);} //第一步預解析:將 var a提升 但因為變量名與函數名相同,故function a()提升時將覆蓋var a,又因為存在兩個相同名稱 的function函數,后寫的將覆蓋先寫的,所以最后提升的只有function a(){alert(3);} console.log(a); //因為函數提升,所以打印的a為函數整體 a=1; //將1賦值給函數a,此時的a為一個變量,不再是函數 console.log(a); //故打印的為a賦的值 console.log(a); a=3; //將a重新賦值3 console.log(a); //故打印結果為3 a(); //此時的a為一個變量,不再是一個函數,所以報錯,js中一旦出現報錯,后面的語句將不再運行,所以最后一個console.log不進行打印。 console.log(a);