2015-10-07 63 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 *)。 –