编写一个可任意调用次数的curried javascript函数,该函数在最后一次函数调用时返回值

Writing a curried javascript function that can be called an arbitrary number of times that returns a value on the very last function call

本文关键字:函数 javascript curried 返回值 函数调用 最后一次 一个 调用 任意      更新时间:2023-09-26

我目前正在处理一个编程问题,该问题要求我制作一个可以用这种方式调用的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函数被连续调用的次数,但我想不出实现这一点的方法。有人能给我指明正确的方向吗?

我读过这两篇关于函数currying的文章(1,2),我理解它们,但我不知道在处理可变数量的参数时如何进行currying。

不可能用未知数量的参数来获取变参数函数。

如果add是一个变差函数,你可以做一些类似的事情

var add5 = curryN(add, 5);
add5(1)(2)(3)(4)(5); //=> 15
var add3 = curryN(add, 3);
add3(1)(2)(3); //=> 6

无法避免这种情况,因为当前函数将继续返回函数,直到接收到最后一个参数,此时计算将运行。


唯一的其他选择是创建某种方式来"短路"参数,并通知函数参数已发送完毕。这需要类似的东西

var xadd = curryUntilUndefined(add);
xadd(1)(2)(3)(4)(5)(undefined); //=> 15

这里,undefined表示变元自变量的结束。我真的不推荐这个,因为它会给你带来其他问题。更不用说,它不是特别好看。

使用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