我目前在个人时间处理编程问题,要求我创建一个可以这种方式调用的javascript函数。
add(1) // 1
add(1)(2) // 3
add(1)(2)(3); // 6
add(1)(2)(3)(4); // 10
add(1)(2)(3)(4)(5); // 15
我无法弄清楚如何让它在最后一次通话时返回一个值。
例如,为了让add(1)(2)
起作用,add(1)
必须返回一个函数,但根据说明add(1)
,当它自己调用时将返回1
我假设你可以克服这个问题的一种方法是弄清楚add
函数被连续多少次被调用,但是我想不出有办法实现这一点。有没有人有任何可以指引我朝正确方向发展的提示?
我已经阅读了这两篇文章(1,2)关于函数curry并且我理解它们,但是我不确定在处理变量时如何进行currying争论的数量。
答案 0 :(得分:4)
使用未知数量的参数来讨论可变参数函数是不可能的。
add
是一个可变函数,你可以做类似
var add5 = curryN(add, 5);
add5(1)(2)(3)(4)(5); //=> 15
var add3 = curryN(add, 3);
add3(1)(2)(3); //=> 6
根本没有避免这个问题,因为一个curried函数将继续返回一个函数,直到收到最后一个参数,此时运行计算。
唯一的另一种选择是创造一些方法来短路"参数并通知函数已完成参数的发送。这需要像
这样的东西var xadd = curryUntilUndefined(add);
xadd(1)(2)(3)(4)(5)(undefined); //=> 15
这里,undefined
表示可变参数的结束。我不是真的推荐这个,因为它可以为你创造其他问题。更不用说,看起来并不是特别好。
答案 1 :(得分:1)
这不可能,使用valueOf()。
function add(initNum) {
var sum = initNum;
var callback = function (num) {
sum += num;
return callback;
};
callback.valueOf = function () {
return sum;
};
return callback;
};
console.log(add(1)(2)==3); //true
console.log(add(1)(1)+1); //3
console.log(add(1)(2)(3).valueOf()); //6