閉包的理解
所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
下面來看一個例子:
function a(){
var tmp=1;
return function a_sub(x){
alert(x+(tmp++));
}
}
var b = a; //此處a和b是一模一樣的,b是從a拷貝了一份過去
var c1 = a(); //此處a加上了括號,於是c1的函數其實就是 a中return回來的函數(此函數可以調用a外面的變量tmp)
var c2 = b(); //為了證明a和b是同樣的功能,且是復制了一份
c1(3); //輸出4
c1(3); //輸出5,——說明a並內存並未釋放
c2(3); //輸出4——說明a和b是復制關系(兩個獨立的對象),內存中互相獨立
這段代碼有幾個注意點:
1、函數a_sub嵌套在函數a內部;
2、函數a返回函數a_sub。
3、a和b是同樣的函數功能
4、obj=a和obj=a()是不一樣的
這樣在執行完c1\c2后,變量c實際上是指向了函數a的內嵌函數a_sub,再執行c1()后就會彈出一個窗口顯示i的值。這段代碼其實就創建了一個閉包,為什么?因為函數a外的變量c引用了函數a內的函數a_sub,就是說:
當函數a的內部函數a_sub被函數a外的一個變量引用的時候(如c1\c2,而不是b),就創建了一個閉包。
閉包的用途:
相同函數可以用多個相互獨立的對象引用,避免代碼冗余、相互污染。閉包函數實際是做的全局變量的功能,在大型項目中,不適用閉包函數的話,相同功能的函數,我們就需要多次創建新的函數,否則同時調用一個函數,不僅會造成后面的函數不能正常使用,如果改動了全局變量,還會對前面正常的函數產生影響、造成污染。因此我們需要用到閉包。而且可以使代碼簡單化,體積小。