可变参数咖喱和功能

问题描述:

我需要一个js求和函数像这样的工作:可变参数咖喱和功能

sum(1)(2) = 3 
sum(1)(2)(3) = 6 
sum(1)(2)(3)(4) = 10 
etc. 

我听到它不能做。但听说如果在sum前面加+就可以做到了。 与+sum(1)(2)(3)(4)类似。
任何想法如何做到这一点?

+0

另请参阅[这里](http://stackoverflow.com/a/18067040/1048572)一些更多的解释 – Bergi 2016-05-29 22:05:32

+3

**变量功能和柯里里不兼容**只是不要这样做!接受的答案是肮脏的黑客。相反,使用半可变函数,其中可变参数在数组中传递。 – ftor 2016-06-24 21:42:41

+0

JavaScript中的函数在默认情况下是可变的,因此以这种方式对语言进行黑客攻击是有害的,因为它可能会让新手感到困惑,因为获得这样的多元fns就是这种方式,而绝对不是。有更多聪明的方法来学习如何使用'valueOf'方法。 – 2017-04-18 12:35:23

不知道如果我明白你想要什么,但

function sum (n) { 
    var v = function (x) { 
     return sum (n + x); 
    }; 

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

    return v; 
} 

console.log(+sum(1)(2)(3)(4)); 

JsFiddle

+0

这看起来确实如此。整洁:) – 2011-04-29 13:58:48

+0

我很高兴我可以帮助:-) – Rafael 2011-04-29 13:59:17

+2

非常好的解决方案。也是实际阅读问题的方式。 :P – 2011-04-29 14:00:28

您可以使用下面的功能

function add(num){ 
    add.sum || (add.sum = 0) // make sure add.sum exists if not assign it to 0 
    add.sum += num; // increment it 
    return add.toString = add.valueOf = function(){ 
     var rtn = add.sum; // we save the value 
     return add.sum = 0, rtn // return it before we reset add.sum to 0 
    }, add; // return the function 
} 

由于函数是对象,我们可以添加属性到它,我们正在被访问时重置。

+0

太好了,阿米特!我喜欢! – 2015-02-12 10:52:13

+0

@YaroslavYakovlev哦!谢谢:) – 2015-02-12 10:53:41

+0

你没有解释你写的是什么-1 – 2015-02-12 11:05:15

要使sum(1)可调用为sum(1)(2),它必须返回一个函数。

该函数可以调用或转换为valueOf的数字。

function sum(a) { 

    var sum = a; 
    function f(b) { 
     sum += b; 
     return f; 
    } 
    f.toString = function() { return sum } 
    return f 
} 

这是最近呼叫使用空托架作为关闭键(从我的最后采访)的一个例子:

总和(1)(4)(66)(35)( 3)()

 function sum(numberOne) { 
     var count = numberOne; 
     return function by(numberTwo) { 
      if (numberTwo === undefined) { 
      return count; 
      } else { 
      count += numberTwo; 
      return by; 
      } 
     } 
    } 
    console.log(sum(1)(4)(66)(35)(3)()); 

我张贴本次修订为自己的职位,因为我显然没有足够的声誉还没有就这么走了注释。这是@Rafael优秀解决方案的修订。

function sum (n) { 
    var v = x => sum (n + x); 
    v.valueOf =() => n; 
    return v; 
} 

console.log(+sum(1)(2)(3)(4)); //10 

我没有看到保留v.toString位的原因,因为它似乎没有必要。如果我错了,请在评论中告诉我为什么需要v.toString(它没有通过我的测试就没问题)。将其余的匿名函数转换为箭头函数以便于阅读。

+0

'toString'表示'console.log(“结果是”+ sum(1)+“!”)'正常工作 – Eric 2016-05-30 10:33:52

+1

'console.log (“结果是”+ sum(1)+“!”)即使在'sum'函数的'v.valueOf'语句中省略了'toString',也会返回字符串'The result is 1!' ,正如我上面所做的那样。仍然不清楚添加'toString'会完成的事情还没有发生。 – Brad 2016-05-30 21:09:04

由于这是一个常见的面试问题,这是一个使用功能属性记忆化添加到sum()函数,并简化其代码一点我的看法:

function sum(x) { 
 
    sum.result = (sum.result) ? sum.result += x : x; 
 
    sum.valueOf = function() { 
 
    return sum.result; 
 
    } 
 
    return sum; 
 
} 
 

 
sum(1)(2)(3); // == 6

这里是一个使用ES6和toString,类似于@Vemba

function add(a) { 
 
    let curry = (b) => { 
 
    a += b 
 
    return curry 
 
    } 
 
    curry.toString =() => a 
 
    return curry 
 
} 
 

 
console.log(add(1)) 
 
console.log(add(1)(2)) 
 
console.log(add(1)(2)(3)) 
 
console.log(add(1)(2)(3)(4))
溶液