首頁 Javascript General Javascript閉包(Closures)之一
Javascript閉包(Closures)之一 列印 填寫電子郵件
(1 位用戶參與評分, 當前平均得到 5.00 顆星星)
Javascript / General / Eddy Chang / 週六, 30 十月 2010 23:03
閉包是一個經常使用於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閉包的特性如下:

  1. 閉包可以讓你把一些資料和可操作資料的函數聯繫在一起
  2. 閉包使得垃圾回收機制不會收回其中函數所占用的資源

參考資料:

評論:

新增回應


驗證碼
更新

關於我something about me

eddy

Eddy Chang

Joomla!台灣站長、資擘(股)軟體工程師

最新留言Latest Comment