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); //undefined 0 0 0
var b = fun(0).fun(1).fun(2).fun(3); //undefined 0 1 2
var c = fun(0).fun(1); c.fun(2); c.fun(3); //undefined 0 1 1
最外层的fn()和最里层的fun()属于一个函数,而第二个fun是另一个新的函数。(注明:所有声明的匿名函数都是一个新函数)。
1.当a=fun(0),相当于n=0,而o没有传值,所以console出来是undefined;
a.fun(1),由于闭包,此时n=0依然存在,执行fun(0,undefined).fun(1)
,返回fun(m,n),此时传值m=1,n=0,此时console出来的值为0;同理a.fun(2)和a.fun(3)相当于fun(2,0)和fun(3,0),所以打印出来的都是0。
2.当b= fun(0),和第一个一样,都是没有给o传值,因此为undefined;
.fun(1)同上面第二个是一样的,所以打印出来也是0;
fun(0).fun(1).fun(2),此时返回的函数是第二次执行的返回对象,所以此时n的值为1,m值为2,相当于fun(2,1),所以打印出来的值为1;
fun(0).fun(1).fun(2).fun(3),此时n值变为2,m值为3,相当于fun(3,2),所以打印出来的值为2。
3.当c=fun(0),和前面同理,因此为undefined;
fun(0).fun(1)同上面第二个是一样的,所以打印出来也是0;
c.fun(2),此时n=1,m=2,fun(2,1),所以打印出来的值为1;
c.fun(3),此时n=1,m=3,fun(3,1),所以打印出来的值为1;
什么是闭包:
1.函数内部的函数;
2.有权访问另一个函数作用域变量的函数;
3.闭包会使变量被引用不能被垃圾回收机制收回,所以如果该变量不再用,请手动释放,可以将值设置为null,避免发生内存泄漏。
闭包是将函数内部和函数外部连接起来的桥梁。
用处:
1.读取函数内部的变量;
2.这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。
闭包的好处:
1:希望一个变量长期驻扎在内存中;
2:避免全局变量的污染;
3:私有成员的存在 。
网友评论