先從閉包特色解釋,應該更好理解.
閉包的兩個特色:
一、做爲一個函數變量的一個引用 - 當函數返回時,其處於激活狀態。
二、一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。
其實上面兩點能夠合成一點,就是閉包函數返回時,該函數內部變量處於激活狀態,函數所在棧區依然保留.
咱們所熟知的主流語言,像C,java等,在函數內部只要執行了return,函數就會返回結果,而後內存中刪除該函數所在的區域.生命週期也就中止了.通常的js函數也是這樣.
可是有閉包特性的js函數有點特殊.
就例子來講:
1 function a(){ 2 var i=0; 3 function b(){ 4 alert(++i); 5 } 6 return b; 7 } 8 var c = a(); 9 c();
這是個標準的閉包.在函數a中定義了函數b,a又return了b的值.這些能夠先無論.
var c = a();
c();
這兩句執行很重要.
在var c = a();這行裏,執行了a函數,那麼確定a通過了return.按照主流語言的函數特性,如今c的值就是a的返回值.
第二行c()的執行實際執行的就是b函數.最後無論執行的是誰,會彈出一個值爲0的窗口,到此爲止,全部的生命週期按理論來講就算所有結束了.
但是,若是咱們再多執行一行.
var c = a();
c();
c();
第一次彈出0,第二次執行卻彈出了1.
也就是說,第一次c()後,a中的i依然保留.天然a在內存的棧區依然保留.
a是return過了,可是,a及內部值卻依然存在,這就是閉包.
好了,總結下,
1,閉包外層是個函數.
2,閉包內部都有函數.
3,閉包會return內部函數.
4,閉包返回的函數內部不能有return.(由於這樣就真的結束了)
5,執行閉包後,閉包內部變量會存在,而閉包內部函數的內部變量不會存在.
閉包的應用場景(呵呵,複製的參考資料)
一、保護函數內的變量安全。以最開始的例子爲例,函數a中i只有函數b才能訪問,而沒法經過其餘途徑訪問到,所以保護了i的安全性。
二、在內存中維持一個變量。依然如前例,因爲閉包,函數a中i的一直存在於內存中,所以每次執行c(),都會給i自加1。
根據參考資料的應用場景,咱們會天然的想到java或是c++的類.雖然JS沒有類的概念,可是有了類的類似執行結果.
另外,還有一種格式頗受爭議:
(function(a,b))(a,b);
若是你使用過jquery,而且觀察過他的代碼,你就會很奇怪他的寫法,網上有人也把這種格式叫作閉包.
引用:http://www.cnblogs.com/rorchach/archive/2013/03/03/2941374.htmlhtml