理解: 閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
原因: 由于在Javascript語言中锥债,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數(shù)內(nèi)部的函數(shù)"锁荔。
本質(zhì): 在本質(zhì)上瞎领,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。
體現(xiàn):
- 在函數(shù)外部勇劣,獲取函數(shù)內(nèi)部的局部變量
- 在函數(shù)外部靖避,操作函數(shù)內(nèi)部的局部變量
內(nèi)部:局部變量會一直存在內(nèi)存當(dāng)中,并不會在函數(shù)調(diào)用后比默,被垃圾回收機(jī)制回收幻捏。
優(yōu)點(diǎn): 可以把局部變量駐留在內(nèi)存中,可以避免使用全局變量(全局變量在復(fù)雜程序中會造成許多麻煩(比如命名沖突,垃圾回收等)命咐,所以推薦使用私有的,封裝的局部變量篡九。而閉包可以實(shí)現(xiàn)這一點(diǎn) )
注意點(diǎn):
由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大醋奠,所以不能濫用閉包榛臼,否則會造成網(wǎng)頁的性能問題伊佃,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是沛善,在退出函數(shù)之前航揉,將不使用的局部變量全部刪除。
閉包會在父函數(shù)外部金刁,改變父函數(shù)內(nèi)部變量的值迷捧。所以,如果你把父函數(shù)當(dāng)作對象(object)使用胀葱,把閉包當(dāng)作它的公用方法(Public Method)漠秋,把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時一定要小心抵屿,不要隨便改變父函數(shù)內(nèi)部變量的值庆锦。