天天看點

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對象的意思了,隻是少了形參和實參統一的步驟罷了。      

繼續閱讀