碰上了个闭包的面试题

2018-03-22

    今天面试有个笔试题是这样的,咋一看返回一个方法又调用自己,瞬间感觉有点晕乎乎的,看了一会也没心情做了,然后就写了一个 undefind ,回来查了一下才发现并不难,只是认真一点一步步分析也就分出来了

       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)

先来 var a 的部分:

当 执行 fun(0);   这个时候打印 o ,肯定是没有的,也就是 undefind

但是此时返回 了一个方法给 a ,方法里 return 回来的 n 其实已经通过传进来赋值保存起来,也就是以下的下面

	var a = {
			fun :function(m){
				return fun(m,n /*(0)*/ )
			}
		}

那么再执行 a.fun(1) 的时候,得到的就是打印了 0 ;  a.fun(2) 和 a.fun(3) 也是同样的结果;

所以 var a 部分 得出的是:   undefind , 0, 0, 0


再来 var b 的部分:

   这个可以拆分成:
                var b = fun(0);  
		var b1 = b.fun(1);  
		var b2 = b1.fun(2);
		var b3 = b2.fun(3);

 b 先执行  fun(0) 和上面 a 一样,undefind,然后返回一个对象方法

	var b = {
			fun :function(m){
				return fun(m,n /*(0)*/ )
			}
		}

那么我执行 b.fun(1) 的时候,这个时候 n = 0 ,所以会打印出 o为 0,这个时候再返回了一个方法给 b1,这个方法中的 n 由于 b.fun(1) 传入了 1,那么这个时候 n = 1,就是以下

	var b1 = {
			fun :function(m){
				return fun(m,n /*(1)*/ )
			}
		}
以此类推后面也是一样, 然后 var b 部分得出的结果就是 : undefind , 0 , 1 ,  2


最后是 c 的部分

由上面的例子中可以得出  var c = fun(0).fun(1) 和 B 中的一样 ,undefind , 0 ;此时 c 的方法就是

	var c = {
			fun :function(m){
				return fun(m,n /*(1)*/ )
			}
		}

那么 c.fun( 2 ) , 得出的结果是 1 ;

而 c.fun(3) 中执行的方法其实也是 c 这个和 a 上面类似  结果也是 1 ,

因为 var  c  中的变量 n 并没有变,变的是 c.fun(2) 返回的方法,更直观一点  var dd = c.fun(2)  , 是 dd 变了 ,并不是 c


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值