執(zhí)行上下文棧
執(zhí)行全局代碼時,會產生一個執(zhí)行上下文環(huán)境,每次調用函數都又會產生執(zhí)行上下文環(huán)境。當函數調用完成時,這個上下文環(huán)境以及其中的數據都會被消除,再重新回到全局上下文環(huán)境。處于活動狀態(tài)的執(zhí)行上下文環(huán)境只有一個。
壓棧出棧過程----執(zhí)行上下文棧:
1、在執(zhí)行之前,首先創(chuàng)建全局上下文環(huán)境
2、代碼執(zhí)行,執(zhí)行到bar(10)之前,全局上下文中的變量在執(zhí)行過程中被賦值。
3、執(zhí)行到bar(10)調用bar函數,同時創(chuàng)建該函數內部的執(zhí)行上下文環(huán)境
4、這時候該執(zhí)行上下文環(huán)境進行壓棧,設置為活動狀態(tài)
5、bar函數執(zhí)行到fn(x + b),調用fn函數,創(chuàng)建了fn函數的執(zhí)行上下文,并壓棧,設置為活動狀態(tài)
6、fn函數執(zhí)行完畢,fn環(huán)境出棧,被銷毀,釋放內存,bar函數變?yōu)榛顒討B(tài)
7、fn函數執(zhí)行完畢并銷毀,意味著bar也執(zhí)行完畢了,此時bar函數環(huán)境出棧,并銷毀。全局環(huán)境變?yōu)榛顒討B(tài)。
到這里這一段代碼的執(zhí)行過程就完畢了。
根據原作者的描述:
其中上下文環(huán)境的變量賦值過程我省略了許多,因為那些并不難,一看就知道。
的確!代碼的大概執(zhí)行過程跑完后,就能很清楚的知道各個執(zhí)行環(huán)境中的變量是個怎樣的狀態(tài)。
講到這里,我不得不很遺憾的跟大家說:其實以上我們所演示的是一種比較理想的情況。有一種情況,而且是很常用的一種情況,無法做到這樣干凈利落的說銷毀就銷毀。這種情況就是偉大的——閉包。要說閉包,咱們還得先從自由變量和作用域說起。
以上內容是小編給大家分享我對JavaScript原型和閉包系列理解(隨手筆記8),希望大家喜歡。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com