Javascript 带两个圆括号和两个参数的JS函数

Javascript 带两个圆括号和两个参数的JS函数,javascript,Javascript,我试图理解一个用两个括号和两个参数运行的函数是如何工作的。像这样: add(10)(10); // returns 20 我知道如何编写一个包含两个参数的函数,如下所示: function add(a, b) { return a + b; } add(10,10); // returns 20 我如何更改该函数,使其可以使用一组或两组参数运行,并产生相同的结果 感谢您的帮助。这简直让我抓狂 提前谢谢 我如何更改该函数,使其可以使用一组或两组参数运行,并产生相同的结果 你几乎可以做到,

我试图理解一个用两个括号和两个参数运行的函数是如何工作的。像这样:

add(10)(10); // returns 20
我知道如何编写一个包含两个参数的函数,如下所示:

function add(a, b) {
  return a + b;
}

add(10,10); // returns 20
我如何更改该函数,使其可以使用一组或两组参数运行,并产生相同的结果

感谢您的帮助。这简直让我抓狂

提前谢谢

我如何更改该函数,使其可以使用一组或两组参数运行,并产生相同的结果

你几乎可以做到,但我正在努力想一个好的理由

方法如下:检测函数接收到多少个参数,如果只接收到一个参数,则返回一个函数而不是一个数字,并在调用该函数时将其添加到第二个数字中:

功能添加(a、b){
if(arguments.length==1){
返回函数(b2){//如果愿意,也可以调用这个参数'b',
返回a+b2;//它将阴影(隐藏、替换)上面的一个
};
}
返回a+b;
}
console.log(添加(10,10));//20
console.log(添加(10)(10));//20
欢迎来到一阶函数的奇妙世界 在JavaScript中,函数可以返回函数,因为函数只是另一个对象。一个简单的实现类似于:

function add(x){
    return function addOther(y){
        return x + y;
    };
}
这是可能的,因为一阶和一阶函数

这还允许您执行部分应用程序,像库这样的库在很大程度上利用了这一点

var addThree = add(3)
addThree(5); // 8
为了扩展和所说的内容,库(披露:我是作者之一)允许您转换如下简单函数:

function add(a, b) {
    return a + b;
}
通过调用
curry
函数将其包装为讨论中的样式:

var add = R.curry(function add(a, b) {
    return a + b;
});

add(3, 5); //=> 8
add(3)(5); //=> 8
var add3 = add(3);
add3(5); //=> 8
关于这个问题,我所知道的最好的文章是休·杰克逊的。我写了一篇更详细的文章


更新 这里有一个版本的
curry
比Ramda中的版本要简单一些。它可以完成上面的工作,还可以做更多的工作,但是没有完成Ramda对占位符值所做的一些事情:

// here is a function that takes a function and returns a curried version
// of it, that is, a version that performs the sort of partial application
// you describe.
var curry = function(fn) {
    // first, we detect how many arguments the function has.
    var fnArity = fn.length; 
    var partialApply = function(args) { 
        // now, let's create a function that's curried
        return function () {
            // collect the previous args as the partial, and add the new 
            // ones you just received
            var newArgs = (args || []).concat([].slice.call(arguments, 0));
            // if we have "enough" arguments, we don't need any more partial
            // application and we can call the function.
            if (newArgs.length >= fnArity) {
                return fn.apply(this, newArgs);
            } else { // else we return a partially applied version
                return partialApply(newArgs);
            }
        };
    };

    return partialApply([]); // a function is itself partially applied with 0 args
};
函数添加(){
var总和=0;
for(var i=0;i
这将适用于任何数量的参数和括号


“我如何更改该函数,使其可以使用一组或两组参数运行,并产生相同的结果?”您为什么要这样做?^^^^这是一个问题。请解释你想做什么,而不是你认为你应该怎么做。谢谢@Abdul找到答案dupe@T.J.Crowder在某些语言中,这是完全相同的,例如哈斯克尔和F#。本贾明鲁恩鲍姆:有趣。是的,我还没有接触到纯函数式语言。”…因此它可以用一组或两组参数运行,并产生相同的结果…”(我的重点)我知道OP要求什么(感谢你确保,老实说),我读了他的问题,然后选择了一个稍微不同的答案以保持简单。。。。Ramda的答案允许它以任何方式运行。:-)将它推广到函数上的“autocurry”(即,调用函数上的
autocurry
)会非常有趣,它可以为N个参数执行此操作,然后显示非常有用的示例-非常类似于如果您正在寻找这样做的好理由,请查看Benjamin提到的Lonsdorf视频,或者我的答案中链接的Jackson的帖子。它可以产生一些真正可读的代码。我从来不知道你可以检测到传递的参数。真的很有帮助!谢谢。如果我需要“catch”来管理“add(10)(10)”中的错误,在哪里做?最后我有error@stackdave:不知道你在问什么。只要一次
尝试
/
捕获
调用就可以了。我正在寻找一种纯JS方式,但我给了Curry一个外观,它看起来非常有趣。我可能会在未来的项目中使用它。谢谢@ScottSauyet谢谢,这更好:)我已经在实现中添加了注释,请随意还原和/或更改我所做的一些更改-一些注释是在非常琐碎的代码位上,但我认为所有这些都会让以前没有做过任何咖喱的人受益。感谢@BenjaminGruenbaum提供的所有注释!
function add() {
  var sum = 0;
  for (var i = 0; i < arguments.length; i++) {
    sum += arguments[i];
  }
  function total() {
    for (var i = 0; i < arguments.length; i++) {
      sum += arguments[i];
    }
    return total;
  }
  total.toString = function () { return sum };

  return total;
}