函數在創建過程中,並不是直接把函數渲染出來,而是一步步的渲染處理。
看下面的黑色圖片。
首先說一下,function的優先級會比var聲明高一些。
下面的圖片里,定義了test()函數,我們從test()的上下文來進行理解
函數一開始根據test()函數的屬性,來創建對應的變量對象。
VO:Variable Object
把所有的函數生命放進現在聲明的變量對象中
然后把所有的變量聲明放進變量對象中
他們其實都是同一個對象,只是處於執行上下文的不同生命周期。不過只有處於函數調用棧棧頂的執行上下文中的變量對象,才會變成活動對象。
附加
在函數里,先執行function的定義。這里有全局函數test()。當然首先建立arguments對象。
在test里有function,function的優先級比var的要高一些,先執行function
在創始階段 foo<foo reference >
<>里面的這一塊是為后面的function准備好的地址。在發現有var,執行var bar:undefined
這里注意.
有兩個foo,此時規定 當var聲明的變量遇到同名屬性時,會跳過不會覆蓋
創建階段完成,進行執行階段,這里就是活動對象和變量對象的分界嶺了
end......