瀏覽器運行整個頁面文檔時(html文件),遇到<script>標簽,立刻喚醒JavaScript解析器來解析js代碼。
JavaScript解析器工作步驟:
1、預解析階段
這個階段,JS解析器從上到下搜索代碼,只去尋找一些關鍵字如var,function這些內容,找到這些內容后,相關的所有的變量都會被先賦值為undefined(這也就是變量提升為啥值會是undefined的具體原因),所有的函數變量都為函數塊。
如果這個階段遇到變量重名的問題,有以下規則:
變量和函數聲明重名了,只留下函數;
函數和函數重名了,根據代碼的上下文順序,留下最后一個。
2、逐行解讀代碼。
這個階段的變量賦值表達式可以修改上一步預解析的值。
如果有多個表達式對相同的變量多次賦值,那么除過函數聲明不能修改上次的賦值,變量賦值和函數表達式都可以修改這個變量的值。
比如
alert(a); //function a(){alert(1)}
var a = 0;
alert(a); //0
var a = 1;
alert(a); //1
var a = function(){
alert(0);
}
alert(a); //function(){alert(0)};
function a(){alert(1)}//因為是函數聲明,不會改變a的值
alert(a); //function(){alert(0);}
在預解析階段,a預解析的順序為undefined(var)->undefined(var)->undefined(var )->function(){alert(1)};(function);
所以才有上面的運行結果。