再探闭包 - pod4g/tool GitHub Wiki
第一个例子
var n = 1;
function f1(){
var n = 999;
nAdd = function(){
n+=1;
}
function f2(){
console.log(n);
}
return f2;
}
var f2 = f1();
f2(); // 999 把 var n = 999; 注释掉 就是1
nAdd();
f2(); // 1000 把 var n = 999; 注释掉 就是2
var f3 = f1();
f3();// 999 把 var n = 999; 注释掉 就是2
第二个例子
var name = "window's name";
var obj = {
name : "obj's name",
getNameFunc:function(){
return function(){
return this.name;
}
}
};
var obj2 = {
name : "obj's name",
getNameFunc:function(){
var that = this; // 注意这行
return function(){
return that.name;
}
}
};
console.log(obj.getNameFunc()()); // window's name
console.log(obj2.getNameFunc()()); // obj's name
第三个例子
function fun(n,o){
console.log(o);
return {
fun: function(m){
return fun(m,n);
}
};
}
var a = fun(0); // ?
a.fun(1); // ?
a.fun(2); // ?
a.fun(3); // ?
var b = fun(0).fun(1).fun(2).fun(3); // ?
var c = fun(0).fun(1); // ?
c.fun(2); // ?
c.fun(3); // ?
// undefined
// 0
// 0
// 0
// undefined, 0, 1, 2
// undefined, 0
// 1
// 1
闭包总结
-
只要是函数嵌套函数都是闭包
-
闭包分为2种
- 有意义的闭包,内部函数在外部函数外部执行(一般是return出去),只有有意义的闭包,GC才不会回收
- 无意义的闭包,内部函数在外部函数内部执行或return出去但是没有接收,此时这种闭包没有意义,GC照样会回收外部函数和内部函数的变量对象
详见我提出的问题关于JavaScript中的闭包的疑问
一个闭包面试题
function fo(){
var i=0;
return function(n){
return n + i++;
}
}
var f=fo();
var a = f(15); // 15
var b = fo()(15); // 15
var c = fo()(20); // 20
var d = f(20); // 21