百度百科中對閉包的定義:
閉包是可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義。“閉包” 一詞來源於以下兩者的結合:要執行的代碼塊(由於自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環境 (作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby 和 Python,objective c 等語言中都能找到對閉包不同程度的支持。
占嶺對閉包的定義:
對於函數A,它內部有子函數B,A函數的返回值為函數B,當A函數的實例被建立之后,由於還存在着對函數B的引用,所以函數B中的值還會存在於內存中,這時函數B的這種浪費內存的行為我們稱為閉包!
在理解閉包之前,我們先來看一下JS變量的作用域吧:
所為使用域就是一個對象或者變量的有效性的范圍,下面的代碼中詳細的說明了這一點
//變量的作用域 function bobo() { var a = 1; //只在bobo函數體中有效 b = 1; //聲明了一個全局變量,在整個<script>塊中有效 function boboSub() { //聲明一個函數,它只在bobo函數中有效 var c = 1; //只有boboSub函數聲中有效 c = c + a; //子函數中可以使用上級函數的變量 } }
通過一個代碼來理解一下閉包吧:
這個例子中有變量i,它是父函數a中的一個變量,它對子函數b是可見的,在函數b中對它進行累加操作,最后函數a將函數b返回,而由於函數a對函數b
存在着地址上的引用,所以,當函數a沒有被釋放時,函數b也不會被釋放,這雖然是不提供的,但在某種情況下是完成一些需求的最佳方式。即浪費的不一定是不好的。
<script>
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();
</script>
它的結果不是0,而是1,這就是閉合的作用,事實上閉合將局部變量B提升了,默認情況下,我們先把直接訪問到函數A的內部函數B,所以閉包還有一個提升變量級別的作用。
好了,寫到這里,Jquery真的不難系列也就寫完了,匆匆忙忙,時間不知不覺過的很快,在這個系列中,我充分投入了進入,可能已經不是代碼這么簡單了,可能在寫作的時候帶有一些感情的色彩,這可能叫身臨其境吧,又或者我走火入魔了,以至於我已經失眠3天了,呵呵!
祝大家早日學有所成吧,好好工作,好好生活吧!就到這吧。
