JS匿名函數&閉包相關

當函數a的內部函數b被函數a外的一個變量引用的時候,就創建了一個閉包。
閉包的作用就是在a執行完並返回後,閉包使得Javascript的垃圾回收機制GC不會收回a所佔用的資源,因爲a的內部函數b的 執行需要依賴a中的變量。
當a返回的不是函數b,情況就完全不同了。因爲a執行完後,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引用,因此函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被GC回收。
閉包作用:1.從外部作用域中獲取局部函數內的變量

2.閉包內的局部變量始終保持在內存中


var a = function(b){//A
	var a = 5;
	alert('init');
	return function(c){//B 對於A來說,函數B爲局部作用域,每次返回都是不同的引用
		alert((++a)+c);
	}
};
alert(a);//得到函數A的引用
a()(2);//a()函數執行,返回匿名函數B的引用 並傳參數2,執行
a()(2);//a()函數執行,返回匿名函數B的引用 並傳參數2,執行

var a = function(b){//A
	var a = 5;
	alert('init');
	return function(c){//B
		alert((++a)+c);
	}
}();//函數A執行,返回匿名函數B的引用
alert(a);//得到函數B的引用
a(2);//傳參數2,執行
a(2);//傳參數2,執行

function foo(x) {//A
	var tmp = 3; 
	//alert('init');
	return function (y) {//B
		alert(x + y + (++tmp)); 
	}	 
}
alert(foo(2));
(foo(2))(10);//foo(2)函數foo執行返回函數B的引用,(foo(2))作爲函數表達式,傳參執行
(foo(2))(10);//同上
var a = foo(2);//存取函數B的引用
a(10);//傳參執行
a(10);//同上

//閉包與類
function Person() {  
    var id;  
    this.getId = function() {  
        return id;  
    }  
    this.setId = function(newId) {  
        id = newId;  
    }  
}  
var p = new Person();  
p.setId(1000);  
alert(p.getId()); // 1000  
alert(p.id); // undefined  

參考&值得推敲:

http://www.cnblogs.com/yuzhongwusan/archive/2011/11/10/2244709.html

http://blog.sina.com.cn/s/blog_68cb8c790100yu61.html

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章