好陌生的一道js面试题,怎么解析呢

function fun(n,o){
    console.log(o);
    return {
        fun:function(m){
            return fun(m,n);
        }
    }
}
var a = fun(0).fun(1);
a.fun(2);
a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0);
c.fun(1);
c.fun(2);
c.fun(3);

问a,b,c分别输出什么???
各位大神,这应该怎么解析呢。’a,b,c这赋值写法很少见?

阅读 3.9k
6 个回答
var a = fun(0).fun(1);
//这里执行fun(0),打印o,o为undefined,并返回一个对象{fun:function(m){return fun(m,n);}},对象里的n指向0
//接下来执行{fun:function(m){return fun(m,n);}}.fun(1),得到的是fun(1,0)的运行结果,即打印0,并把{fun:function(m){return fun(m,n);}}赋值给a(此时n指向1)
//记住 a = {fun:function(m){return fun(m,n);}} (此时n指向1)
a.fun(2);
//这里执行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(2,1)的运行结果,即打印1,并返回{fun:function(m){return fun(m,n);}},没有接收方
a.fun(3);
//这里执行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(3,1)的运行结果,即打印1,并返回{fun:function(m){return fun(m,n);}},没有接收方
var b =fun(0).fun(1).fun(2).fun(3);
//这里执行fun(0),打印o,o为undefined,并返回一个对象{fun:function(m){return fun(m,n);}},对象里的n指向0
//接下来执行{fun:function(m){return fun(m,n);}}.fun(1),得到的是fun(1,0)的运行结果,即打印0,并返回{fun:function(m){return fun(m,n);}} (此时n指向1)
//接下来执行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(2,1)的运行结果,即打印1,并返回{fun:function(m){return fun(m,n);}} (此时n指向2)
//接下来执行{fun:function(m){return fun(m,n);}}.fun(3),得到的是fun(3,2)的运行结果,即打印2,并返回{fun:function(m){return fun(m,n);}}赋值给b (此时n指向3)
var c =fun(0);
//这里执行fun(0),打印o,o为undefined,并返回一个对象{fun:function(m){return fun(m,n);}}赋值给c,对象里的n指向0
c.fun(1);
//这里执行{fun:function(m){return fun(m,n);}}.fun(1),得到的是fun(1,0)的运行结果,即打印0,并返回{fun:function(m){return fun(m,n);}},没有接收方
c.fun(2);
//这里执行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(2,0)的运行结果,即打印0,并返回{fun:function(m){return fun(m,n);}},没有接收方
c.fun(3);
//这里执行{fun:function(m){return fun(m,n);}}.fun(3),得到的是fun(3,0)的运行结果,即打印0,并返回{fun:function(m){return fun(m,n);}},没有接收方

fun方法返回了一个对象 对象的fun属性又是这个fun方法 所以不论调谁的fun方法 都返回一个对象 可以对输入的参数做记忆

外层fun函数返回一个对象,这个对象的fun函数返回的外层fun函数的调用结果,o是会记忆的。按照这个就应该很好分析出来

新手上路,请多包涵

第一个:var a = fun(0).fun(1);相当于执行外面的fun(n,o)函数,因为o没有传参,所以console.log(o)为undefined,然后
return {

fun:function(m){
    return fun(m,n);
}

}
的意思就是将里面的fun:function(m)赋值给fun(0),然后在则行他,相当于则行fun(m,n),最后结果赋值给a

var a = fun(0).fun(1);

a.fun(2);
a.fun(3);     的完整流程:

fun(0) == fun(n,o){ 
    //这里o没传参,所以值为undefined
    console.log(o); o = undefined 
    return fun:function(m){  //到了这一步,就相当于 fun() = fun:function(m){return         
                                                                           fun(m,n);}
              return fun(m,n); n = 1 //接受上面的参数,为1
            }
    }
然后fun(0).fun(1) 就相当于执行了 刚刚return会来的函数 fun(m,1),又回到最外层的函数,以此类推
输出结果为:undefined,0,1,1

语言组织能力一般,请见谅
    function fun(n,o){    //fun一
        console.log(o);
        return {
            fun:function(m){  //fun二
                return fun(m,n);   //fun三
            }
        }
    }

首先要弄清楚这里的三个fun到底是指的什么

fun一:一个全局的函数,返回值是一个对象obj
fun二:是返回对象obj里面的一个键(key),这个键对应的是一个匿名函数
fun三:调用的fun一

从最开始理解var a = fun(0).fun(1);
最先执行的是fun(0)这个时候没有第二个参数o,所以为undefined
这个时候fun(0)返回了一个对象:

    {
        fun:function(m){
            return fun(m,0);  
            }
    }
    var a = fun(0).fun(1); 
    //这时候再把1带入就是
  
    var a = function(1){ return fun(1,0)};
    
    //其实就是
    var a = fun(1,0);   //这个时候o为0 ----打印为0  
    
   //返回的对象为  
   {
        fun:function(m){
            return fun(m,1);  
            }
    }
    
    a.fun(2);  //也就是  fun(2,1) ----打印为1
   
    a.fun(3);  //也就是  fun(3,1) ----打印为1
    
    //a一系列的打印下来    undefined   0  1  1
    
    

后面的B和C像这样一部一部的推即可

首先要明白一件事,fun的返回值是什么?返回值是如下的一个东西。

{
    fun:function(m){
        return fun(m,n);
    }
}

n,o是调用形成的闭包中的一个变量。全图中只有return fun(m,n);这个位置传入了n,n是调用的时候创建的,那么就是上次传入的值。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题