學(xué)習(xí)Ajax模式之前,需要對閉包和回調(diào)函數(shù)的概念有所理解.
閉包的概念
當(dāng)一個函數(shù)內(nèi)調(diào)用另一個函數(shù),同時這個函數(shù)引用了父函數(shù)的變量的時候,執(zhí)行父函數(shù)的時候,父函數(shù)的內(nèi)部變量不會被銷毀,而是像被東西包裹住了阻礙了內(nèi)存回收機(jī)制.這個包裹機(jī)制就叫做閉包closure.
從設(shè)計者的角度理解閉包
- 廣義地理解函數(shù)
函數(shù)本身也是一種特殊的對象. 可以理解成為一種有功能的,能被執(zhí)行這種功能的對象. 既然是對象,當(dāng)然希望對象內(nèi)能 永久地 隔離的 保存它私有的屬性. 閉包就是這一種設(shè)計模式. - 和函數(shù)作用域相違背
因為JS自帶內(nèi)存回收機(jī)制,在這種機(jī)制作用下,函數(shù)的變量在函數(shù)執(zhí)行完后會被自動回收,那么作為函數(shù)這個對象的屬性的變量自然無法作為私有變量一樣地保存,所以閉包這種模式被設(shè)計出來. 既然把函數(shù)完全當(dāng)做對象看待,那么就可以在這個對象中加入對象的方法. 在函數(shù)對象的方法里調(diào)用對象的屬性, 這種被方法所保護(hù)的屬性就不會被垃圾回收機(jī)制處理. 就像一個泡泡包住了這個屬性.
從函數(shù)式編程角度理解閉包
- 閉包首先是又函數(shù)式編程中引入的,函數(shù)式編程有幾個
為什么閉包難理解
一開始看閉包的時候也覺得比較困惑,思路全集中在為什么上了. 其實這是閉包被過分解讀了. 閉包無非是語JS設(shè)計出來的一種使用模式, 只要知道,會用就行了.