添加作为参数传递的多个变量以进行函数currying

时间:2017-10-24 06:50:07

标签: javascript function currying

如何使用函数currying实现这些场景?

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

我读过这么多博客无法找到这种情况。有人可以帮我这个。

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分:0)

我在这里看到两个令人讨厌的场景:

<强> 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 });
        }
    }
}

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