閉包的作用就是在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