今天有人問我什么是閉包,我說(shuō):技術(shù)上講,javascript函數(shù)都是閉包,只要你返回的局部變量。目測(cè)對(duì)我的話表示深深懷疑。
首先來(lái)談什么是閉包?
函數(shù)對(duì)象可以通過(guò)作用域連相互關(guān)聯(lián)起來(lái),函數(shù)內(nèi)部的變量都可以保留在函數(shù)的作用域內(nèi),這種特性在計(jì)算機(jī)文獻(xiàn)中被稱為"閉包"。而不是緊緊理解為函數(shù)嵌套函數(shù) return目標(biāo)變量。
1.函數(shù)嵌套函數(shù)

打開瀏覽器控制臺(tái)輸出1,閉包的確實(shí)現(xiàn)了我們想要的效果,由于作用域的關(guān)系,本身我們是拿不到 b 變量的值。如果不用閉包為什么拿不到 b 的值呢?因?yàn)樵诤瘮?shù)執(zhí)行結(jié)束 b的引用計(jì)數(shù)為0 就被銷毀了。而在閉包中 fn2函數(shù)最后 return 了 b 變量,b 變量的引用計(jì)數(shù)就不是0了。因此 b 變量仍然保留在作用域連中,這也就導(dǎo)致了一個(gè)問題,使用不好閉包會(huì)導(dǎo)致內(nèi)存被大量占用。
2.為什么我說(shuō)從技術(shù)角度上 返回內(nèi)部變量的javascript 函數(shù)都是閉包

fn3僅僅有一個(gè)函數(shù),函數(shù)也是對(duì)象并且他們都關(guān)聯(lián)到作用域連。運(yùn)行這段代碼控制臺(tái)輸出1,變量 c 也被保存到作用域連中,函數(shù)執(zhí)行結(jié)束也沒有將 c 變量銷毀。
所以從技術(shù)角度上 返回內(nèi)部變量的javascript 函數(shù)都是閉包。不要僅僅限于常見的函數(shù)嵌套函數(shù)。