<script type="text/javascript"> function outer(){ var i = 10; function inner(){ var j = 100; alert(j);//100 alert(i);//10 alert(adf); } inner(); } outer(); </script>
下圖清晰的展現(xiàn)了上述代碼的內(nèi)存分配與作用域分配情況: 下面來(lái)解釋一下: 1.載入代碼,創(chuàng)建全局執(zhí)行環(huán)境,此時(shí)會(huì)在可變對(duì)象(window)中添加outer變量,其指向于函數(shù)對(duì)象outer,此時(shí)作用域鏈中只有window對(duì)象. 2.執(zhí)行代碼,當(dāng)程序執(zhí)行到outer()時(shí),會(huì)在全局對(duì)象中尋找outer變量,成功調(diào)用。 3.創(chuàng)建outer的執(zhí)行環(huán)境,此時(shí)會(huì)新創(chuàng)建一個(gè)活動(dòng)對(duì)象,添加變量i,設(shè)置值為10,添加變量inner,指向于函數(shù)對(duì)象inner.并將活動(dòng)對(duì)象壓入作用域鏈中.并將函數(shù)對(duì)象outer的[[scope]]屬性指向活動(dòng)對(duì)象outer。此時(shí)作用域鏈為outer的活動(dòng)對(duì)象+window. 4.執(zhí)行代碼,為 i 成功賦值。當(dāng)程序執(zhí)行到inner()時(shí),會(huì)在函數(shù)對(duì)象outer的[[scope]]中尋找inner變量。找到后成功調(diào)用。 5.創(chuàng)建inner的執(zhí)行環(huán)境,新建一個(gè)活動(dòng)對(duì)象,添加變量j,賦值為100,并將該活動(dòng)對(duì)象壓入作用域鏈中,并函數(shù)對(duì)象inner的[[scope]]屬性指向活動(dòng)對(duì)象inner.此時(shí)作用域鏈為:inner的活動(dòng)對(duì)象+outer的活動(dòng)對(duì)象+全局對(duì)象. 6.執(zhí)行代碼為j賦值,當(dāng)訪問(wèn)i、j時(shí)成功在作用域中找到對(duì)應(yīng)的值并輸出,而當(dāng)訪問(wèn)變量adf時(shí),沒(méi)有在作用域中尋找到,訪問(wèn)出錯(cuò)。