2015-10-07 60 views
-1

最近我在一次採訪中提出了一個問題,這兩個輸出將會是相同的總和(2,3)和總和(2)(3),即5「。編寫一個功能,其中「sum(2,3)」和「sum(2)(3)」的輸出將爲5

請給出任何想法,如果有可能的話。

在此先感謝

+0

總和(2)(3)...是不可能的 – Rakin

+0

@Rakin有可能在JavaScript中。代碼'result = sum(2)(3)'與'f = sum(2)'實際上是一樣的。結果= f(3)',沒有中間變量。這是因爲JavaScript函數本身就是(第一類)值。 – user2864740

+0

很棒..新信息謝謝@ user2864740 – Rakin

回答

3

對於sum(x)(y),有sum(x)返回另一個函數f,使得f(y) - 即。 (sum(x))(y) - 評估結果正確。請參閱Eloquent JavaScript: Higher-Order Functions關於如何關閉 - 以及從函數返回函數的示例 - 使這成爲可能。當用單數參數調用任一即時之和,對於sum(x, y)或前述'curried' function

arguments.length屬性可用於確定有多少參數都被提供給第(sum)函數和相應的反應。

(鏈接的「咖喱JavaScript函數:不,不是咖喱辣,但咖喱類lambda-微積分」文章實際上包含一個完整的解決方案..但它覺得提供代碼在這裏將是作弊。)

+1

我不認爲這會是「作弊」,相反它會有幫助,因爲鏈接可能永遠不存在(只需在包含代碼時給予獎勵)。也有人懶惰,可能不想去另一個網頁並尋找它。 –

3

這是你的簡單功能,無需計數ARGS:

function sum(a,b){ 
    if(b===undefined){ 
     return function(c){ return parseInt(a)+parseInt(c);} 
    } 
    return parseInt(a)+parseInt(b); 
} 
console.log(sum(2,3)); 
console.log(sum(2)(3)); 
+0

'b ='''在某些瀏覽器中不起作用(* Chrome *)。 –