js預編譯AO物件及GO物件
簡單談一下js的預編譯過程。
function test(a,b){
console.log(a)
var a=123;
function a(){}
console.log(b)
var b=234;
console.log(b)
function b(){}
console.log(a)
var b=function(){}
console.log(b)
}
test(1)
我先說一下列印結果,結合例項給大家講一下我對預編譯的理解。
fn-a fn-b 234 123 fn-b
首先js的執行過程會先掃描一下整體語法語句,如果存在邏輯錯誤或者語法錯誤,那麼直接報錯,程式停止執行,沒有錯誤的話,開始從上到下解釋一行執行一行。
但是js中首先你要清楚變數宣告和函式宣告是會提升的。
計算機執行到test()函式時,在執行的前一刻會建立一個ao物件。
ao{
}
這是第一步,建立一個ao物件,第二步是將函式內所有的形參和變數宣告儲存到ao物件中,value為undefined;
ao{
a:undefined,
b:undefined
}
第三步將形參和實參進行統一。
ao{
a:1,
b:undefined
}
第四步將所有的函式宣告的函式名作為ao物件中的key,函式整體內容作為value,儲存到ao物件中
ao{
a:function(){},
b:function(){}
}
之後開始列印的a,其實列印的就是ao物件中的a,然後a賦值123,在列印肯定就是123了,裡面細節有很多,但是整體步驟就是這些,適合有點基礎的前端看,用於給大家鞏固一下ao物件的執行過程,go物件同理,只是go指向的是window物件,其實window物件也就是go物件的意思了,只是少了形參和實參統一的步驟罷了。
有問題的話可以來本人個人部落格留言:http://www.funtechstudy.com/