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