可变的咖喱和函数
我需要一个js总和函数来这样工作:
sum(1)(2) = 3 sum(1)(2)(3) = 6 sum(1)(2)(3)(4) = 10 etc.
我听说不能做到。 但是听说如果在前面加上+
就可以了。 像+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));
的jsfiddle
我将这个版本作为自己的post发布,因为我显然没有足够的声望,只是留下评论。 这是@Rafael优秀解决scheme的修订。
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(没有它就通过了我的testing)。 将其余的匿名函数转换为箭头函数以便于阅读。
这是一个在上次调用中使用空括号作为关键(从我上次访谈开始)的例子:
总和(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)());
你可以使用下面的function
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 }
由于函数是对象,所以我们可以为它添加属性,当它被访问时我们将重置属性。
要将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 }
由于这是一个常见的面试问题,下面是我使用函数属性添加memoization到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
的解决scheme,类似于@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))