一直想把閉包相關的東西整理出來,這篇文章算是閉包相關知識的最終版。javascript
主要分下面幾個大的方面:html
1、定義及運行
2、特性
3、內存泄露和監控
4、應用
下面詳細說下。前端
1、定義及運行java
下面是在百度的時候,作的一次相關分享,能夠不妨掃一掃這個ppt,在ppt後,我再提取關鍵信息。git
我再抽取一下關鍵的信息:github
對於閉包的定義不少書籍都很模糊,我的認爲比較準確的定義——chrome
閉包是函數的代碼在運行過程當中的一個動態環境
函數和閉包要有很是清晰的對比——緩存
一個函數只是一段靜態的代碼、腳本文本,所以它是一個代碼書寫時,以及編譯期的、靜態的概念;而閉包則是函數的代碼在運行過程當中的一個動態環境,是一個運行期的、動態的概念。
閉包做爲與函數成對的數據,在函數執行過程當中處於激活(便可訪問)狀態(通俗來說,就是當執行到函數的某一條語句的時候,哪些對象可以被使用)。
還有一點,就是閉包的實現方式——閉包
JavaScript使用做用域鏈來實現閉包,做用域鏈由執行環境維護,JavaScript中全部的標識符都是經過做用域鏈來查找值的。
2、特性函數
閉包最爲核心的特性即是保存狀態,源於活動對象(VO)中全部的變量均置於內存之中,相對而言,激活對象(AO)中的全部變量,在函數執行完成以後,將被垃圾回收器處理。
再具體的東西,在此就不細說了,主要理解了閉包的定義天然就理解它的這個特性。
3、內存泄露及監控
這點,我作的不夠充分。先引入幾篇文章——
JavaScript Memory Leaks(對應的中文翻譯:JavaScript內存泄露):這篇文章主要講解JavaScript致使內存泄露的幾個緣由,其中一條即是閉包的使用。
JavaScript內存分析:這篇文章主要講解如何使用chrome的開發者工具進行內存的分析
這個是司徒正美推薦的一個內存泄露分析的工具——javascript 內存泄露工具使用,在這兒也推薦推薦。
4、應用
這裏優先推薦Barret Lee的文章——JS閉包的用途,在這兒重點強調一下:
1. 匿名自執行函數:或者能夠理解爲,避免污染全局變量
2. 緩存:源於閉包的核心特性即是保存狀態,應用此特性即可對須要的變量進行緩存
3. 實現封裝:一樣可使用閉包保存狀態的特性,充當一個做用域塊,將塊裏面的屬性變量至於內存之中來實現封裝
4. 閉包的另外一個重要用途是實現面向對象中的對象,傳統的對象語言都提供類的模板機制:原理同上
總之,這些均是基於閉包的保存狀態特性來實現。
5、總結
OK,閉包的話題一直纏繞前端JavaScript理論中的明星話題,並非一朝一夕就能夠理解透徹的,但願看到的同窗,多在實踐當中思考閉包的種種。