javascript中的閉包

瞭解閉包前,需要對JavaScript的變量作用域有一定的瞭解,請參考文章:
[url]http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html#1865103[/url]
[url]http://blog.csdn.net/hzrui/archive/2009/02/27/3941137.aspx[/url]
[b]一、閉包的定義[/b]
官方定義:[quote]閉包是可以包含自由(未綁定)變量的代碼塊;這些變量不是在這個代碼塊或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義。[/quote]
上面提到的“代碼塊”,在實際應用中通常會是一個函數。
下面看一個簡單的例子1:
var message = "hello world";
function sayHelloWorld(){
alert(message);
}
sayHelloWorld();//運行結果爲:"hello world"

例1中, message並未在函數sayHelloWorld中定義,而在其外部定義,即在閉包官方定義中的“定義代碼塊中的環境”定義。
常用的形式是在一個函數中定義另一個函數,例2:
var count=10;
var f1 = function(num1,num2){
function f2(){
return count+num1+num2;
}
return f2();
};
alert(f1(1,2));//運行結果爲:13

例2中,f2作爲f1的內部函數,並未接受參數,函數執行是需要的值是從執行環境中獲取的。f2無疑是閉包
[b]二、閉包的作用[/b]
1.在函數外部訪問函數的局部變量。例3;
function f1(){
var i=100;
function f2(){
return ++i;
}
return f2;
}
var result =f1();
alert(result());//結果爲101

在例3中利用閉包在函數f1外部訪問了,局部變量i的值。[b]注意:如果定義變量時不加var關鍵字,則此變量爲全局變量,全部變量均爲window對象的屬性[/b]
2.在內存中維持變量。
將例3稍作修改,例4:
function f1(){
var i=100;
rel = function(){i+=1};
function f2(){
return ++i;
}
return f2;
}
var result =f1();
alert(result());//結果101
rel();
alert(result())//結果103

例4中,f1的局部變量i在第一次調用f1後並未被回收,而是一直駐留內存,這是由於f2被賦給了全局變量result,而f2依賴於f1,所以在使用時f1和f2都是駐留在內存中的
[b]三、總結[/b]
javascript的很多高級應用都要用到閉包,但是使用閉包時要格外小心,不恰當的使用會導致內存泄露,在設計時要保證退出函數時銷燬全部不再使用的局部變量。
參考資料:[url]http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章