基礎(chǔ)概念
什么是閉包
簡單來說,閉包是指可以訪問另一個函數(shù)作用域變量的函數(shù)戏蔑,一般是定義在外層函數(shù)中的內(nèi)層函數(shù)。
為什么需要閉包呢
局部變量無法共享和長久的保存闯团,而全局變量可能造成變量污染辛臊,所以我們希望有一種機制既可以長久的保存變量又不會造成全局污染仙粱。
特點
- 占用更多內(nèi)存
- 不容易被釋放
何時使用
既想反復使用,又想避免全局污染
如何使用
1.定義外層函數(shù)伐割,封裝被保護的局部變量。
2.定義內(nèi)層函數(shù)隔心,執(zhí)行對外部函數(shù)變量的操作白群。
3.外層函數(shù)返回內(nèi)層函數(shù)的對象,并且外層函數(shù)被調(diào)用硬霍,結(jié)果保存在一個全局的變量中帜慢。
函數(shù)生命周期
直接上圖唯卖,點擊圖片方法查看。要記住函數(shù)對象拜轨、作用域鏈對象、執(zhí)行環(huán)境(EC)和活動對象(AO)這幾個東西都啥時候出現(xiàn)卵沉,啥時候消失法牲。
例子實戰(zhàn)
看下面這個函數(shù),函數(shù)對象的地址僅作標識拒垃,不代表真實的地址。
var getNum;//------------------------1
function getCounter() { // ----------2
var n = 1;
var inner = function () { return n++; }
return inner;
}
getNum = getCounter();//------------3
console.log(getNum()); //1 ---------4
console.log(getNum()); //2 ---------5
程序運行到2的時候:
程序運行到3的時候:
運行到4的時候怜森,外層函數(shù)調(diào)用結(jié)束,AO對象釋放姥宝,圖中紅線斷了:
4處的代碼執(zhí)行時:
4處的代碼執(zhí)行完:
總結(jié):可以看到內(nèi)層函數(shù)對象被全局的變量getNum引用恐疲,所以內(nèi)層函數(shù)相關(guān)的AO對象,作用域鏈對象在函數(shù)調(diào)用完都無法被內(nèi)存回收碳蛋,因此占用了更多的內(nèi)存空間省咨,但是這樣持久的保存了需要的n
肃弟。