|
閉包是一個經常使用於Javascript預先定義函式的作法。閉包技術在現在許多程式語言已包含,或有類似概念的作法,事實在早在1960年代就已經在很古老的Schema語言中被實作。閉包的產生是很簡單的概念,在函式中包含的內嵌函式即可產生出閉包,通常還包含有未進行定義數值的變數,稱之為自由變數(free variable)。在許多說法中,會認為閉包並非一個真正的函式,而是一個函式和引用環境組合的個體,行為類似於函式。這種說法的根據是函式只會存在一個實例,而不同的閉包是不同的實例。
最簡單的解說範例是這個,一個用來作相加的函式:
1
2
3
4
5
6
7
8
9
10
11
|
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
alert(add5(2)); // 7
alert(add10(2)); // 12
|
仔細看看執行了add5=makeAdder(5)後,add5的得到數值是什麼?是一個匿名的函式。而add10是另一個匿名的函式。這兩個形成了閉包,但是是共享原先makeAdder函式的定義。
另一個可以觀察每個閉包的獨立性的範例:
1
2
3
4
5
6
7
8
9
10
11
|
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c(); //i=1
var d=a();
d(); //i=?
|
在這個範例中的第11行執行後,會出現1還是2的alert視窗?答案很清楚,因為閉包是彼此獨立的執行空間,當然是1。
透過這些技術文章的說明,我歸結出一些關於Javascript閉包的特性如下:
- 閉包可以讓你把一些資料和可操作資料的函數聯繫在一起
- 閉包使得垃圾回收機制不會收回其中函數所占用的資源
參考資料:
評論: |