var a=function(){var i=0;return function(){return i++}};
var bb=a();
bb();//0
bb();//1
bb();//2

image.png
如圖所示,紅色為a,黃色為b,紫色為c。
在b中,函數(shù)c為返回值,bb=a()中,bb得到的返回值其實(shí)是一個(gè)函數(shù),則bb()執(zhí)行的時(shí)候,執(zhí)行的是函數(shù)c的值,bb=a()時(shí),產(chǎn)生b的活動(dòng)對(duì)象,bb()執(zhí)行的時(shí)候,產(chǎn)生一個(gè)c的活動(dòng)對(duì)象,加上全局的一個(gè)活動(dòng)對(duì)象,此時(shí),有三個(gè)活動(dòng)對(duì)象存在,所以bb()執(zhí)行的時(shí)候,i并未被回收。
閉包其實(shí)實(shí)質(zhì)上是阻斷了js的垃圾回收機(jī)制,
js的垃圾回收在兩個(gè)地方執(zhí)行,一是函數(shù)運(yùn)行之后回收,二是隔一段時(shí)間檢查是否有需要待回收的垃圾。
所以,若要使閉包被回收,則將bb=null即可。