闭包-小题目

 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:  fun(0)  调用第一层函数,传参进去为fun(0,o),console出来o,但是o未定义,所以值是undefined;首先:a.fun(1)则是在前面的基础上调用内部return下 
		的函数,即fun:,对应的把1传给m,再返回到第一层函数,即m=1,n=0.n=0是第一次调用时的值,本次为fun(1,0)。console出来值为0;然后a.fun(2),跟上面
		是同理的,即传参后为fun(2,0),console出来第二个参数值仍然为0;a.fun(3)即为fun(3,0),console出来仍然值为0.
      第二行b: fun(0) 使n=0,console是o的值,o是未定义,结果undefined;接下来在上一个基础上计算.fun(1),调用第二次函数,也就是返回下的函数,传参进去,
		使得m=1,此时闭包了n=0,即fun(1,0),再返回第一层函数,console出来值为0;接下来在继续计算.fun(2),fun(2)则是调用第二次函数,也就是字面量,
		传参进去m=2,此时闭包了上次的n=1,即fun(2,1),再调用第一层函数,console出来值为1;.fun(3)是同理的,即fun(3,2),console出来值为2;
      第三行c:fun(0)依旧是undefined,.fun(1)依旧是0;(注意:c中存放的是fun(1)的返回值)c.fun(2)即在fun(1),执行第二层函数,即为fun(2,1),console
		出来值为1;c.fun(3)仍然是在fun(1)基础上,执行第二层函数,即为fun(3,1),console出来结果仍然为1.
简单来说:第一行一直在执行a=fun(0)为基础的函数 即第二层函数 一直闭包第一次执行的 n=0		        fun(1,0)  fun(2,0)  fun(3,0)
	  第二行一直执行上一步的值作为本次闭包,n的值依次增加传给下一位,              	 		fun(1,0)fun(2,1)fun(3,2)
	  第三行一直执行a.fun(0).fun(1),即fun(1)中n=1为闭包,下面一直延续使用它的闭包	 		fun(1,0)fun(2,1)fun(3,1)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值