閉包的兩個特色: javascript
function a(){ var i=0; function b(){ alert(++i); } return b; } var c = a(); 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,而且觀察過他的代碼,你就會很奇怪他的寫法,網上有人也把這種格式叫作閉包.