javascript - 具有多个参数的函数调用 2 种方式

标签 javascript

正如我们大多数人所知,我们可以创建一个像这样的简单函数。

function calc(a,b){
   return a+b
}
calc(1,1); //returns 2

我们也可以做这样的事情

function calc(a){
    return function(b){
      return a+b
    }
}
calc(1)(1); //returns 2

如果我们有多个参数怎么办?

function calc() {
    function r(arg) {
        var a = [];
        for(var i = 0, l = arg.length; i < l; i++){
            a[i] = arg[i];
        }

        return a.reduce(function(p, c) {
          return p + c;
        });

    }
    var res = r(arguments);
    return function() {
        res += r(arguments);
        return res;
    }
}

这适用于 calc(1,2)(1),但不适用于 calc(1,2,1)

有没有办法结合两个版本? 这意味着当调用时 calc(1,1) 我们也可以调用 calc(1)(1) 并且两者仍然会返回 2。

calc(1,2,3) calc(1,2)(3) calc(1)(2,3) > 都会返回 6

最佳答案

它需要知道有多少个参数来进行计算;-)

你可以创建一个函数来将事情变成那种函数 像这样的东西:

function curry(f){
  var args = [];
  return addargs;
  function addargs(){
    args=args.concat([].slice.call(arguments));
    return args.length<f.length? addargs.bind(this) : f.apply(this,args);
  }
}

然后你可以做这样的事情:

var calc = curry(function(a,b,c){return a+b+c});
calc(1,2)(3); // = 6

但你不能让它接受可变数量的参数柯里化(Currying)这些参数 - 它不知道何时返回答案

关于javascript - 具有多个参数的函数调用 2 种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31834764/

相关文章:

javascript - 过滤 Angular Table td 时出现问题

javascript - 我如何对我的数据关闭 ="modal"产生两种效果;一个重新加载父页面,而另一个不加载

javascript - 在 MeteorJS 中以编程方式创建本地文件夹

javascript - p5.j​​s 将不受scale()函数影响的元素添加到 Canvas 上

javascript - vuelidate 中可选的嵌套验证

javascript - React - '$' 未定义

javascript - 带有多字节文件和 JavaScript 的 Windows 应用商店应用程序中的 ReadTextAsync

javascript - 可选的链接运算符在将我的应用程序构建到 Heroku 时给出 SyntaxError 但在我的机器上工作

javascript - 如何使用 .siblings() 在 javascript 中定位 ul li 输入复选框项目

Javascript 函数只调用一次