1. JavaScript 的運行:
JavaScript有一個特點,就是瀏覽器在執行JavaScript代碼時會逐行執行,一行代碼錯誤,其後面的代碼塊都不會被執行出來,那麼,在腳本執行js引擎的時候,會產生三個步驟:
(1)語法分析:檢測代碼有沒有錯誤
(2)預編譯環節
(3)根據編譯好的進行逐行執行(最後纔會進行逐行執行)
2. 預編譯環節:
(1)在預編譯之前,頁面產生並創建了GO(Global Object)全局對象,也就是window對象,只需分析變量聲明和函數聲明;
(2)在函數運行前的一瞬間,會生成一個AO(Active Object)對象;
(3)開始分析參數,形參作爲 AO對象的屬性名,實參作爲AO對象的屬性值;
(4)接下來分析變量聲明,變量名爲屬性名,變量值爲undefined,如果遇到同名的情況,則不做任何改變;
(5)再接着分析函數聲明,函數名爲屬性名,值爲函數體,如果遇到同名的情況,直接覆蓋;
注:函數執行一次,就會產生一次預編譯的過程,預編譯就是執行前的過程;
3.變量聲明和函數聲明:
var a = 123; //變量聲明
function self(){} //函數聲明
4.實例演示:
function test(){
console.log(b);
if(a){
var b = 100;
}
console.log(b);
c = 234;
console.log(c);
}
var a ;
test();
console.log(c);
開始分析:
//預編譯過程:
//1.頁面產生GO對象
//GO:{
test : function (形參爲屬性名,實參爲屬性值)
a : undefined (變量名爲屬性名,變量值爲undefined)
c : undefined (因爲沒有值,所有事undefined)
}
//2.函數運行前的一瞬間,再產生一個AO對象,編譯函數體內的內容
//AO:{
b : undefined
c : undefined
test : function
}
//預編譯結束,開始逐行執行
//第一個b沒有值,輸出undefined
//第二個b雖然附了值,但是走不到if判斷中,輸出undefined
//第三個c賦予了值,輸出234
//第四個c同樣輸出234,因爲c = 234是沒有聲明的變量,是全局變量,歸window對象所有