今天有人問我什么是閉包诸狭,我說:技術(shù)上講飒硅,javascript函數(shù)都是閉包,只要你返回的局部變量作谚。目測對我的話表示深深懷疑三娩。
首先來談什么是閉包?
函數(shù)對象可以通過作用域連相互關(guān)聯(lián)起來妹懒,函數(shù)內(nèi)部的變量都可以保留在函數(shù)的作用域內(nèi)雀监,這種特性在計算機文獻中被稱為"閉包"。而不是緊緊理解為函數(shù)嵌套函數(shù) return目標(biāo)變量眨唬。
1.函數(shù)嵌套函數(shù)
打開瀏覽器控制臺輸出1会前,閉包的確實現(xiàn)了我們想要的效果,由于作用域的關(guān)系匾竿,本身我們是拿不到 b 變量的值瓦宜。如果不用閉包為什么拿不到 b 的值呢?因為在函數(shù)執(zhí)行結(jié)束 b的引用計數(shù)為0 就被銷毀了岭妖。而在閉包中 fn2函數(shù)最后 return 了 b 變量临庇,b 變量的引用計數(shù)就不是0了。因此 b 變量仍然保留在作用域連中昵慌,這也就導(dǎo)致了一個問題假夺,使用不好閉包會導(dǎo)致內(nèi)存被大量占用。
2.為什么我說從技術(shù)角度上 返回內(nèi)部變量的javascript 函數(shù)都是閉包
fn3僅僅有一個函數(shù)斋攀,函數(shù)也是對象并且他們都關(guān)聯(lián)到作用域連已卷。運行這段代碼控制臺輸出1,變量 c 也被保存到作用域連中淳蔼,函數(shù)執(zhí)行結(jié)束也沒有將 c 變量銷毀侧蘸。
所以從技術(shù)角度上 返回內(nèi)部變量的javascript 函數(shù)都是閉包裁眯。不要僅僅限于常見的函數(shù)嵌套函數(shù)。