今天在csdn上看到一个闭包的例子,感觉挺不错的,就在此记录下来1
2
3
4
5
6
7
8
9
10
11function 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