分析如下代碼的輸出結果
題目一
var message = "全局作用域"
function foo() {
console.log(message);
}
function bar() {
var message = "bar中"
foo()
}
bar()
解答
-
在編譯階段碟嘴,瀏覽器會創(chuàng)建一個全局對象GO楼肪,該對象包含重多屬性如,String,Number等,另外會聲明全局對象message济欢,定義函數(shù)bar、foo小渊,如圖:
image.png -
編譯完成后開始執(zhí)行法褥,創(chuàng)建全局執(zhí)行上下文,包含vo對象和具體執(zhí)行的代碼酬屉,執(zhí)行完第一行后半等,如圖:
image.png -
函數(shù)繼續(xù)執(zhí)行,執(zhí)行到第12行時呐萨,開始執(zhí)行函數(shù)bar杀饵,創(chuàng)建一個函數(shù)執(zhí)行上下文,包含指向AO(activation object)的VO對象
image.png -
繼續(xù)執(zhí)行
image.png -
繼續(xù)執(zhí)行谬擦,創(chuàng)建新的函數(shù)執(zhí)行上下文切距,包含一個vo對象指向新的AO對象(圖中為AO2),在foo中并沒有定義或賦值惨远,只是打印對應的值
image.png
結論
這里并沒有打印bar中谜悟,是因為函數(shù)的作用域在編譯的時候就已經(jīng)確定了话肖,跟執(zhí)行的順序是沒有關系的
另外的一些題
image.png
- 其中
var a = b = 100
相當于var a = 100; b = 100
在JS中相當于定義了局部變量a
和全局變量b