概要? :? 閉包是可訪問上一層函數作用域里變量的函數,即使上一層函數已經關閉。
詳情:
官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
關于閉包,最簡單的描述就是JavaScript 允許使用內部函數--即函數定義和函數表達式位于另一個函數的函數體內。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數和聲明 的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。也就是說,內部函數會在外部函數返回后被執行。而當這個內部 函數執行時,它仍然必需訪問其外部函數的局部變量、參數以及其他內部函數。這些局部變量、參數和函數聲明(最初時)的值是外部函數返回時的值,但也會受到 內部函數的影響。
說的更透徹一些,所謂"閉包",就是在構造函數體內定義另外的函數作為目標對象的方法函數,而這個對象的方法函數反過來引用外層函數體中的臨時變量。這使得只要目標對象在生存期內始終能保持其方法,就能間接保持原構造函數體當時用到的臨時變量值。盡管最開始的構造函數調用已結束,臨時變量的名稱也都消失了,但在目標對象的方法內卻始終能引用到該變量的值,而該值只能通過這種方法來訪問。即使再次調用相同的構造函數,但只會生成新對象和方法,新的臨時變量只是對應新的值,和上次那次調用的是各自獨立的。
在JavaScript中創建一個閉包:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c();
這段代碼有兩個特點:
1、函數b嵌套在函數a內部
2、函數a返回函數b
引用關系圖
這樣在執行完var c=a( )后,變量c實際上是指向了函數b,再執行c( )后就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實就創建了一個閉包,為什么?因為函數a外的變量c引用了函數a內的函數b,就是說:
當函數a的內部函數b被函數a外的一個變量引用的時候,就創建了一個閉包。
作用
簡而言之,閉包的作用就是在a執行完并返回后,閉包使得Javascript的垃圾回收機制不會收回a所占用的資源,因為a的內部函數b的執行需要依賴a中的變量。這是對閉包作用的非常直白的描述,不專業也不嚴謹,但大概意思就是這樣,理解閉包需要循序漸進的過程。
在上面的例子中,由于閉包的存在使得函數a返回后,a中的i始終存在,這樣每次執行c(),i都是自加1后alert出i的值。
那 么我們來想象另一種情況,如果a返回的不是函數b,情況就完全不同了。因為a執行完后,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引 用,因此函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被回收。(Javascript的垃圾回收機制)
模擬私有變量
function Counter(start){
var count = start;
return{
increment:function(){
count++;
},
get:function(){
return count;
}
}
}
var foo =Counter(4);
foo.increment();
foo.get();// 5
結果
這里,Counter 函數返回兩個閉包,函數 increment 和函數 get。 這兩個函數都維持著 對外部作用域 Counter 的引用,因此總可以訪問此作用域內定義的變量 count。
閉包的特點:
1、作為一個函數變量的一個引用,當函數返回時,其處于激活狀態。
2、一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。
簡單的說,JavaScript允許使用內部函數——即函數定義和函數表達式位于另一個函數的函數體內。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所以局部變量、參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。
JavaScript垃圾回收的原則 : 如果一個對象不再被引用,那么這個對象會被垃圾回收器回收。如果兩個對象無干擾的互相作用,那么這兩個對象也會被回收。
閉包在JavaScript編程中的重要作用:
1 、 為執行的函數提供參數
2 、將對象的方法與其他實例關聯
? 3、模擬靜態私有變量
參考文章地址:
http://www.cnblogs.com/yangjian/archive/2009/09/24/1573176.html
http://baike.baidu.com/view/648413.htm
http://www.cnblogs.com/zhangle/archive/2010/07/02/1770206.html
http://www.cnblogs.com/chongzi/
http://www.360doc.com/content/09/1227/11/370235_12087397.shtml
http://softbbs.pconline.com.cn/9497825.html