可变参数咖喱和功能
我需要一个js求和函数像这样的工作:可变参数咖喱和功能
sum(1)(2) = 3
sum(1)(2)(3) = 6
sum(1)(2)(3)(4) = 10
etc.
我听到它不能做。但听说如果在sum
前面加+
就可以做到了。 与+sum(1)(2)(3)(4)
类似。
任何想法如何做到这一点?
不知道如果我明白你想要什么,但
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));
这看起来确实如此。整洁:) – 2011-04-29 13:58:48
我很高兴我可以帮助:-) – Rafael 2011-04-29 13:59:17
非常好的解决方案。也是实际阅读问题的方式。 :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
}
由于函数是对象,我们可以添加属性到它,我们正在被访问时重置。
太好了,阿米特!我喜欢! – 2015-02-12 10:52:13
@YaroslavYakovlev哦!谢谢:) – 2015-02-12 10:53:41
你没有解释你写的是什么-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(它没有通过我的测试就没问题)。将其余的匿名函数转换为箭头函数以便于阅读。
由于这是一个常见的面试问题,这是一个使用功能属性记忆化添加到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))
另请参阅[这里](http://stackoverflow.com/a/18067040/1048572)一些更多的解释 – Bergi 2016-05-29 22:05:32
**变量功能和柯里里不兼容**只是不要这样做!接受的答案是肮脏的黑客。相反,使用半可变函数,其中可变参数在数组中传递。 – ftor 2016-06-24 21:42:41
JavaScript中的函数在默认情况下是可变的,因此以这种方式对语言进行黑客攻击是有害的,因为它可能会让新手感到困惑,因为获得这样的多元fns就是这种方式,而绝对不是。有更多聪明的方法来学习如何使用'valueOf'方法。 – 2017-04-18 12:35:23