【问题标题】:Add multiple variable passed as parameter to function currying将作为参数传递的多个变量添加到函数柯里化
【发布时间】:2025-12-16 09:30:01
【问题描述】:

如何使用函数柯里化来实现这些场景?

add(3,4)(3)
add(3)(4)(3)
add(3)(4,3)

我读了很多博客都找不到这种情况。有人可以帮我解决这个问题吗?

【问题讨论】:

标签: javascript function currying


【解决方案1】:

这样的?

var total = 0;
function add(){
    // Add up every argument received
    for (var i in arguments)
        total += arguments[i];
        
    return add;
}

add(3,4)(3);
console.log(total);

add(3)(4)(3);
console.log(total);

add(3)(4,3);
console.log(total);

更新

如果您不希望函数依赖于全局变量,请将值保存为add函数的属性

function add(){
    // Add up every argument received
    for (var i in arguments)
        add.total += arguments[i];
        
    return add;
}

add.total = 0;
add.toString = function(){
  var total = add.total;
  
  add.total = 0;
  
  return total;
};

var sum1 = add(3,4)(3);
alert( sum1 );

var sum2 = add(3)(4)(3);
alert( sum2 );

var sum3 = add(3)(4,3);
alert( sum3 );

【讨论】:

  • 例如感谢@Thum Choon Tat
  • @FelixKling hghi
【解决方案2】:

我在这里看到两个柯里化场景:

1.

add(3,4)(3)
add(3)(4,3)

2.

add(3)(4)(3)

您可以使用的第一个:

function add() {
    const args1 = Array.prototype.slice.call(arguments);
    return function() {
        const args2 = Array.prototype.slice.call(arguments);
        return args1.concat(args2).reduce(function(a, i) { return a + i });
    }
}

第二个有:

function add() {
    const args1 = Array.prototype.slice.call(arguments);
    return function() {
        const args2 = Array.prototype.slice.call(arguments);
        return function() {
            const args3 = Array.prototype.slice.call(arguments);
            return args1.concat(args2).concat(args3).reduce(function(a, i) { return a + i });
        }
    }
}

我没有找到一个解决方案来同时处理这两个问题。

【讨论】:

  • @gil.fernandes:是的,您是正确的阅读 Felix Kling 发表的文章。如何在 JavaScript 函数调用中预设参数的可能重复项? (部分函数应用) – Felix Kling 昨天