舉例說明

列印結果 101 102 當時疑惑 第一次demo執行完畢 執行期上下文被釋放 第二次應該列印undefiend
錯誤認識 第一次執行完畢 銷毀的執行器上下文 為b函數自己的執行期上下文 但是他無法銷毀 來自于A的執行期上下文
故其列印仍是a函數執行期上下文中 的值 該AO一直為b函數所有 b執行完回歸到b被定義的狀态
閉包概念
當内部函數被儲存到外部時,将會生成閉包。閉包會導緻原有作用域鍊不釋放,造成記憶體洩露
閉包作用
累加器
可以做緩存
列印出 eating banana
立即執行函數
定義:此類函數沒有聲明,在一次執行過後即釋放。适合做初始化工作。 主要針對初始化函數
定義形式
(function abc() {
........
}())
傳回值直接用變量去接
這叫函數 聲明 不叫表達式 是以會報文法解析錯誤
這個叫做函數 表達式 可以執行
這要将函數聲明變成表達式就可以執行
function test() {
console.log(12212);
}(1,2,3,4)
理論上将絕不可以這楊 但是實際上不報錯 系統識别為 函數聲明 和 (1,2,3,4)兩部分
最常見的閉包現象
每一次for循環 将數組每一位指派為一個函數
每一個對應的i都儲存在立即執行函數中的j 并且被傳回到外部 此時閉包解決
解決原理 : 立即執行函數 将内部函數儲存到test AO的數組中 再進一步 儲存到 test函數外部
此時arr數組拿着立即執行函數的勞動成果 j
myarr函數拿着test中arr函數中的 的勞動成果