1姊扔、定義: 嵌套在函數(shù)作用域中的函數(shù),稱為閉包函數(shù)梅誓。該作用域稱為閉包環(huán)境旱眯。通過閉包函數(shù)可以訪問閉包函數(shù)所在函數(shù)作用域中的形參與變量
2、表現(xiàn)形式: 使函數(shù)外部能夠調(diào)用函數(shù)內(nèi)部定義的變量
3证九、工作原理:
利用了js中的垃圾回收機制删豺,當一個函數(shù)被調(diào)用時,開辟空間愧怜,函數(shù)調(diào)用結(jié)束呀页,釋放空間,垃圾回收機制釋放被調(diào)用結(jié)束的函數(shù)時拥坛,發(fā)現(xiàn)函數(shù)的變量正在被其他的函數(shù)調(diào)用蓬蝶,這些變量不會被釋放,而且被永久駐留在內(nèi)存猜惋,只有退出程序丸氛,才會被釋放,或者是手工釋放(=null)
4著摔、變量的作用域
要理解閉包缓窜,首先必須理解Javascript特殊的變量作用域。
變量的作用域分類:全局變量和局部變量谍咆。
特點:
1禾锤、函數(shù)內(nèi)部可以讀取函數(shù)外部的全局變量;在函數(shù)外部無法讀取函數(shù)內(nèi)的局部變量摹察。
2恩掷、函數(shù)內(nèi)部聲明變量的時候,一定要使用var命令供嚎。如果不用的話黄娘,你實際上聲明了一個全局變量!
5克滴、使用閉包的注意點
1)濫用閉包逼争,會造成內(nèi)存泄漏:由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大偿曙,所以不能濫用閉包氮凝,否則會造成網(wǎng)頁的性能問題羔巢,在IE中可能導(dǎo)致內(nèi)存泄露望忆。解決方法是罩阵,在退出函數(shù)之前,將不使用的局部變量全部刪除启摄。
2)會改變父函數(shù)內(nèi)部變量的值稿壁。所以,如果你把父函數(shù)當作對象(object)使用歉备,把閉包當作它的公用方法(Public Method)傅是,把內(nèi)部變量當作它的私有屬性(private value),這時一定要小心蕾羊,不要隨便改變父函數(shù)內(nèi)部變量的值喧笔。