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