2017-07-18 43 views
0

我在一次採訪中遇到了這個問題。我沒有得到如何解決這個問題。 問:寫和功能,將增加2個數字,但數字可以傳遞給函數在以下幾個方面:在javascript中關閉多個空函數以求函數

  1. 總和(3)(4)//答案應該是7
  2. 總和(3 )()(4)//答案應該是7
  3. 總和(3)()()()()(4)//答案應該b 7分配

我可以使用閉合解決第一功能,實際上對於第二個函數,我也可以檢查參數,如果參數長度爲零,我可以再次調用除了下一個參數之外的和。 但如何使其通用?意思是即使你的第一個參數和最後一個參數有'N'個呼叫&那些可以是空的或參數化的,它應該返回總和。

+0

我已經添加了詳細的解釋和解決方案的視頻。 –

回答

1

function add (n) { 
 
    var func = function (x) { 
 
     if(typeof x==="undefined"){ 
 
      x=0; 
 
     } 
 
     return add (n + x); 
 
    }; 
 
    
 
    func.valueOf = func.toString = function() { 
 
     return n; 
 
    }; 
 
    
 
    return func; 
 
    } 
 
    console.log(+add(1)(2)(3)()()(6));

我已經給這個問題Here

的答案,但根據你的問題,我修改了

function add (n) { 
var func = function (x) { 
    if(typeof x==="undefined"){ 
     x=0; 
    } 
    return add (n + x); 
}; 

func.valueOf = func.toString = function() { 
    return n; 
}; 

return func; 
} 
console.log(+add(1)(2)(3)()()(6)); 

運行的代碼一樣,

console.log(+add(1)(2)(3)()()(6)); 
+1

接受這個答案,如果你有你的答案因爲它會對別人有幫助 –

+1

這似乎是更通用的,因爲它可能需要超過2個參數。 –

+0

是的,這是通用的,因爲它可能需要n個參數。歡呼:) –

-1

你可以用很多方法來做到這一點,但大多數情況下你會想要命名遞歸。也就是說,你可以有類似:

sum = start => (...args) => args.length? args[0] + start : sum(start) 

但它看起來更清潔爲寫:

function sum(start) { 
    function out(...args) { 
     return args.length? start + args[0] : out 
    } 
    return out; 
} 
3

錄製的視頻如何解決這個問題:

https://youtu.be/7hnYMIOVEg0

文本回答:

function sum(numberOne) { 
    return function innerSum(numberTwo) { 
     if (typeof(numberTwo) === 'number') { 
      return numberOne + numberTwo; 
     } 

     return innerSum; 
    } 
} 

輸出:

sum(3)(4); => 7 
sum(5)()()(10); => 15 

基本上,你需要,直到收到一個值返回內部函數(innerSum)了 - 那麼你返回number

您還可以爲您的方法選擇其他名稱 - 例如_sum()addToFirstNumber()

0

function sum(num1) { 
 
    return function sum2(num2) { 
 
    if(num2 === undefined) { 
 
     return sum2; 
 
    } 
 

 
    return num1 + num2; 
 
    } 
 
} 
 

 
console.log(sum(4)()()()(3)); // -> 7

或者在ES6:

const add = num1 => num2 => num2 === undefined ? add(num1) : num1 + num2; 
 

 
console.log(add(4)()()()()()(3)); // -> 7

0

您可以隨時返回一個函數內功能:

let a; 

function sum(value) { 
    if (typeof value !== "number") { 
    return sum; 
    } 

    if (typeof a !== "number") { 
    a = value; 
    return sum; 
    } 

    let result = a + value; 
    a = null; 
    return result; 
} 

看到https://jsfiddle.net/d9tLh11k/1/

0

這應該這樣做

function sum(num1) { 
    if (arguments.length === 0){ 
     return sum; 
    } 

    return function innerSum(num2) { 
     if (arguments.length > 0){ 
      return num1 + num2; 
     }else{ 
      return innerSum; 
     } 

    } 
}