js闭包的经典例子

今天在csdn上看到一个闭包的例子,感觉挺不错的,就在此记录下来

1
2
3
4
5
6
7
8
9
10
11
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);

分别输出a,b,c三行的值?

首先第一行:

1.var a = fun(0)
等价于fun(0,undefined),因为未传递第二个参数,所以打印出undefined;

2.a.fun(1)
因为闭包,所以此时的n依然存在,所以此式等同于fun(0,undefined).fun(1);
所以a.fun(1)返回的就是fun(m,n);
m传进去的值为1,n依然为内存中的0,所以fun(1,0)输出的就是0;
后面两部同理:第一行的后面两步就换了一下参数。第二行就相当于一直迭代,第三行就是稍加变化,重点在这一步

3.a.fun(2)
返回fun(2,0),依然为0

4.a.fun(3)
返回fun(3,0),依然为0

所以第一行的值undefined,0,0,0

第二行:

1.var b = fun(0)
与第一行一样,打印为undefined

2..fun(1)
此时与第一行的一样,返回fun(1,0),为0

3..fun(2)
此时变为fun(1,0).fun(2),返回的是fun(2,1),所以打印为1;

4..fun(3),
返回fun(3,2),打印出的为2;

最后第三行与前面两行相似,弄懂了前面的,,这个就不在话下了,输出的结果为undefined,0,1,1

文章目录
  1. 1. 首先第一行:
  2. 2. 第二行: