当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的 执行需要依赖a中的变量。
当a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。
闭包作用:1.从外部作用域中获取局部函数内的变量
参考&值得推敲:
闭包的作用就是在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