为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2019-03-05 21:19:32
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这赋值写法很少见?
查看完整描述

5 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

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);}},没有接收方


查看完整回答
反对 回复 2019-03-18
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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


查看完整回答
反对 回复 2019-03-18
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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


查看完整回答
反对 回复 2019-03-18
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

第一个: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


语言组织能力一般,请见谅


查看完整回答
反对 回复 2019-03-18
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

    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像这样一部一部的推即可


查看完整回答
反对 回复 2019-03-18
  • 5 回答
  • 0 关注
  • 537 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信