Vo對象
每一個執(zhí)行上下文都會關(guān)聯(lián)一個vo(Variable Object)對象,變量和函數(shù)聲明都會被添加到這個對象當中空猜。
當全局代碼被執(zhí)行的時候,全局代碼的上下文關(guān)聯(lián)的就是GO對象了筑舅,
JS代碼執(zhí)行前
在JS代碼前會進行js的解析階段,這個時候我們
因為這塊代碼是全局代碼陨舱,所以在他解析的時候會把用到的變量和函數(shù)都放在與之關(guān)聯(lián)的VO也就是GO中翠拣,這個時候內(nèi)存中的表現(xiàn)
將代碼用到的變量加到Go中因為這個時候只是解析階段還沒有執(zhí)行所以變量的值都是undefined還有一個foo函數(shù),當解析到函數(shù)的時候,函數(shù)會被優(yōu)先處理內(nèi)存中開辟一個空間用來存放函數(shù)
JS代碼執(zhí)行后
JS代碼是從上往下執(zhí)行的游盲,下面我們就依次執(zhí)行代碼
下一塊代碼是函數(shù)误墓,函數(shù)還沒有被執(zhí)行所以跳過蛮粮,依次去修改Go中num1 num2 以及result 最后打印出來結(jié)果
最后一步是函數(shù)的執(zhí)行,內(nèi)存中的表現(xiàn)谜慌,下一篇文章繼續(xù)說
(之所以我們可以在變量定義前就打印在函數(shù)定義的位置之前就可以調(diào)用函數(shù)然想,就是因為經(jīng)過了一次解析階段這些變量沒被執(zhí)行的時候就已經(jīng)在VO中了,只不過沒執(zhí)行的時候沒有值欣范,這里只討論var定義的 let const后面說到塊級作用域的時候再來分析)