闭包-小题目

来源:互联网 发布:海宁淘宝摄影 编辑:程序博客网 时间:2024/04/28 23:53
 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)

原创粉丝点击