本篇初步介紹作用域的概念及產(chǎn)生過程舒裤。
執(zhí)行期上下文
上篇說了函數(shù)在執(zhí)行的前一刻,會(huì)進(jìn)行預(yù)編譯過程觉吭,創(chuàng)建一個(gè)執(zhí)行期上下文對(duì)象:AO或GO腾供。它定義了函數(shù)執(zhí)行期的環(huán)境,且每次調(diào)用都會(huì)產(chǎn)生一個(gè)新的執(zhí)行期上下文對(duì)象鲜滩,在函數(shù)調(diào)用結(jié)束后伴鳖,該對(duì)象立馬銷毀。
作用域
每個(gè)函數(shù)對(duì)象都會(huì)有一個(gè)[[scope]]屬性徙硅,該屬性就是函數(shù)的作用域榜聂,它存儲(chǔ)了執(zhí)行期上下文的集合,該屬性只能JavaScript引擎調(diào)用嗓蘑。
作用域鏈
[[scope]]中存儲(chǔ)的執(zhí)行期上下文集合呈鏈?zhǔn)浇Y(jié)構(gòu)须肆,我們把這種結(jié)構(gòu)叫做作用域鏈。
作用域的生成過程
我們通過如下的一個(gè)函數(shù)來分析函數(shù)作用域的生成過程桩皿。
首先豌汇,a函數(shù)在定義時(shí),會(huì)生成如下作用域:
然后泄隔,執(zhí)行a函數(shù)拒贱,生成如下作用域:
a函數(shù)執(zhí)行時(shí),b函數(shù)定義,b定義時(shí)逻澳,生成如下作用域闸天,從圖中可以看出,b在定義時(shí)的作用域直接指向a執(zhí)行時(shí)生成的執(zhí)行期上下文斜做,它們共用相同的執(zhí)行期上下文苞氮。
b函數(shù)執(zhí)行時(shí),生成如下的作用域:
當(dāng)b執(zhí)行完成后陨享,b的作用域變回到b定義時(shí)的狀態(tài)葱淳,同理钝腺,a執(zhí)行完成后抛姑,a的作用域也變回到a定義時(shí)的狀態(tài)。
通過作用域內(nèi)部保存的作用域鏈艳狐,我們可以按照該鏈至頂向下查找變量(也即從函數(shù)內(nèi)部向其外部查找)定硝。