JS閉包的理解

ptjs 12年前發布 | 748 次閱讀 CCleaner

先從閉包特點解釋,應該更好理解.

閉包的兩個特點:

1、作為一個函數變量的一個引用 - 當函數返回時,其處于激活狀態。
2、一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。

其實上面兩點可以合成一點,就是閉包函數返回時,該函數內部變量處于激活狀態,函數所在棧區依然保留.

我們所熟知的主流語言,像C,java等,在函數內部只要執行了return,函數就會返回結果,然后內存中刪除該函數所在的區域.生命周期也就停止了.一般的js函數也是這樣.
但是有閉包特性的js函數有點特殊.
就例子來說:
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函數.最后不管執行的是誰,會彈出一個值為1的窗口,到此為止,所有的生命周期按理論來說就算全部結束了.
可是,如果我們再多執行一行.
var c = a();
c();
c();
第一次彈出1,第二次執行卻彈出了2.

也就是說,第一次c()后,a中的i依然保留.自然a在內存的棧區依然保留.

a是return過了,但是,a及內部值卻依然存在,這就是閉包.

好了,總結下,
1,閉包外層是個函數.
2,閉包內部都有函數.
3,閉包會return內部函數.
4,閉包返回的函數內部不能有return.(因為這樣就真的結束了)
5,執行閉包后,閉包內部變量會存在,而閉包內部函數的內部變量不會存在.

閉包的應用場景(呵呵,復制的參考資料)
1、保護函數內的變量安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。
2、在內存中維持一個變量。依然如前例,由于閉包,函數a中i的一直存在于內存中,因此每次執行c(),都會給i自加1。

根據參考資料的應用場景,我們會自然的想到java或是c++的類.雖然JS沒有類的概念,但是有了類的相似執行結果.

另外,還有一種格式頗受爭議:
(function(a,b))(a,b);
如果你使用過jquery,并且觀察過他的代碼,你就會很奇怪他的寫法,網上有人也把這種格式叫做閉包.  

 本文由用戶 ptjs 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!