鍍金池/ 問答/HTML5  HTML/ 好陌生的一道js面試題,怎么解析呢

好陌生的一道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分別輸出什么???
各位大神,這應(yīng)該怎么解析呢?!痑,b,c這賦值寫法很少見?

回答
編輯回答
初心

fun方法返回了一個(gè)對(duì)象 對(duì)象的fun屬性又是這個(gè)fun方法 所以不論調(diào)誰的fun方法 都返回一個(gè)對(duì)象 可以對(duì)輸入的參數(shù)做記憶

2018年9月20日 09:11
編輯回答
不討囍

外層fun函數(shù)返回一個(gè)對(duì)象,這個(gè)對(duì)象的fun函數(shù)返回的外層fun函數(shù)的調(diào)用結(jié)果,o是會(huì)記憶的。按照這個(gè)就應(yīng)該很好分析出來

2017年7月2日 03:04
編輯回答
寫榮

第一個(gè):var a = fun(0).fun(1);相當(dāng)于執(zhí)行外面的fun(n,o)函數(shù),因?yàn)閛沒有傳參,所以console.log(o)為undefined,然后
return {

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

}
的意思就是將里面的fun:function(m)賦值給fun(0),然后在則行他,相當(dāng)于則行fun(m,n),最后結(jié)果賦值給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){  //到了這一步,就相當(dāng)于 fun() = fun:function(m){return         
                                                                           fun(m,n);}
              return fun(m,n); n = 1 //接受上面的參數(shù),為1
            }
    }
然后fun(0).fun(1) 就相當(dāng)于執(zhí)行了 剛剛return會(huì)來的函數(shù) fun(m,1),又回到最外層的函數(shù),以此類推
輸出結(jié)果為:undefined,0,1,1

語言組織能力一般,請(qǐng)見諒
2017年7月9日 21:48
編輯回答
不歸路

首先要明白一件事,fun的返回值是什么?返回值是如下的一個(gè)東西。

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

n,o是調(diào)用形成的閉包中的一個(gè)變量。全圖中只有return fun(m,n);這個(gè)位置傳入了n,n是調(diào)用的時(shí)候創(chuàng)建的,那么就是上次傳入的值。

2017年4月8日 09:27
編輯回答
帥到炸
    function fun(n,o){    //fun一
        console.log(o);
        return {
            fun:function(m){  //fun二
                return fun(m,n);   //fun三
            }
        }
    }

首先要弄清楚這里的三個(gè)fun到底是指的什么

fun一:一個(gè)全局的函數(shù),返回值是一個(gè)對(duì)象obj
fun二:是返回對(duì)象obj里面的一個(gè)鍵(key),這個(gè)鍵對(duì)應(yīng)的是一個(gè)匿名函數(shù)
fun三:調(diào)用的fun一

從最開始理解var a = fun(0).fun(1);
最先執(zhí)行的是fun(0)這個(gè)時(shí)候沒有第二個(gè)參數(shù)o,所以為undefined。
這個(gè)時(shí)候fun(0)返回了一個(gè)對(duì)象:

    {
        fun:function(m){
            return fun(m,0);  
            }
    }
    var a = fun(0).fun(1); 
    //這時(shí)候再把1帶入就是
  
    var a = function(1){ return fun(1,0)};
    
    //其實(shí)就是
    var a = fun(1,0);   //這個(gè)時(shí)候o為0 ----打印為0  
    
   //返回的對(duì)象為  
   {
        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像這樣一部一部的推即可

2017年4月7日 11:59
編輯回答
何蘇葉
var a = fun(0).fun(1);
//這里執(zhí)行fun(0),打印o,o為undefined,并返回一個(gè)對(duì)象{fun:function(m){return fun(m,n);}},對(duì)象里的n指向0
//接下來執(zhí)行{fun:function(m){return fun(m,n);}}.fun(1),得到的是fun(1,0)的運(yùn)行結(jié)果,即打印0,并把{fun:function(m){return fun(m,n);}}賦值給a(此時(shí)n指向1)
//記住 a = {fun:function(m){return fun(m,n);}} (此時(shí)n指向1)
a.fun(2);
//這里執(zhí)行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(2,1)的運(yùn)行結(jié)果,即打印1,并返回{fun:function(m){return fun(m,n);}},沒有接收方
a.fun(3);
//這里執(zhí)行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(3,1)的運(yùn)行結(jié)果,即打印1,并返回{fun:function(m){return fun(m,n);}},沒有接收方
var b =fun(0).fun(1).fun(2).fun(3);
//這里執(zhí)行fun(0),打印o,o為undefined,并返回一個(gè)對(duì)象{fun:function(m){return fun(m,n);}},對(duì)象里的n指向0
//接下來執(zhí)行{fun:function(m){return fun(m,n);}}.fun(1),得到的是fun(1,0)的運(yùn)行結(jié)果,即打印0,并返回{fun:function(m){return fun(m,n);}} (此時(shí)n指向1)
//接下來執(zhí)行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(2,1)的運(yùn)行結(jié)果,即打印1,并返回{fun:function(m){return fun(m,n);}} (此時(shí)n指向2)
//接下來執(zhí)行{fun:function(m){return fun(m,n);}}.fun(3),得到的是fun(3,2)的運(yùn)行結(jié)果,即打印2,并返回{fun:function(m){return fun(m,n);}}賦值給b (此時(shí)n指向3)
var c =fun(0);
//這里執(zhí)行fun(0),打印o,o為undefined,并返回一個(gè)對(duì)象{fun:function(m){return fun(m,n);}}賦值給c,對(duì)象里的n指向0
c.fun(1);
//這里執(zhí)行{fun:function(m){return fun(m,n);}}.fun(1),得到的是fun(1,0)的運(yùn)行結(jié)果,即打印0,并返回{fun:function(m){return fun(m,n);}},沒有接收方
c.fun(2);
//這里執(zhí)行{fun:function(m){return fun(m,n);}}.fun(2),得到的是fun(2,0)的運(yùn)行結(jié)果,即打印0,并返回{fun:function(m){return fun(m,n);}},沒有接收方
c.fun(3);
//這里執(zhí)行{fun:function(m){return fun(m,n);}}.fun(3),得到的是fun(3,0)的運(yùn)行結(jié)果,即打印0,并返回{fun:function(m){return fun(m,n);}},沒有接收方
2017年10月4日 09:16