如果要更加深入的了解閉包以及函數(shù)a和嵌套函數(shù)b的關(guān)系,我們需要引入另外幾個概念:函數(shù)的執(zhí)行環(huán)境(excution context)、活動對象(call object)、作用域(scope)、作用域鏈(scope chain)。以函數(shù)a從定義到執(zhí)行的過程為例闡述這幾個概念。
- 當定義函數(shù)a的時候,js解釋器會將函數(shù)a的作用域鏈(scope chain)設(shè)置為定義a時a所在的“環(huán)境”,如果a是一個全局函數(shù),則scope chain中只有window對象。
- 當執(zhí)行函數(shù)a的時候,a會進入相應(yīng)的執(zhí)行環(huán)境(excution context)。
- 在創(chuàng)建執(zhí)行環(huán)境的過程中,首先會為a添加一個scope屬性,即a的作用域,其值就為第1步中的scope chain。即a.scope=a的作用域鏈。
- 然后執(zhí)行環(huán)境會創(chuàng)建一個活動對象(call object)?;顒訉ο笠彩且粋€擁有屬性的對象,但它不具有原型而且不能通過JavaScript代碼直接訪問。創(chuàng)建完活動對象后,把活動對象添加到a的作用域鏈的頂端。此時a的作用域鏈包含了兩個對象:a的活動對象和window對象。
- 下一步是在活動對象上添加一個arguments屬性,它保存著調(diào)用函數(shù)a時所傳遞的參數(shù)。
- 后把所有函數(shù)a的形參和內(nèi)部的函數(shù)b的引用也添加到a的活動對象上。在這一步中,完成了函數(shù)b的的定義,因此如同第3步,函數(shù)b的作用域鏈被設(shè)置為b所被定義的環(huán)境,即a的作用域。
了解更多內(nèi)容:請訪問:
雨點網(wǎng)絡(luò) 石家莊網(wǎng)站制作 石家莊網(wǎng)站建設(shè)