首页 > 解决方案 > 以不同方式传递参数,函数仍应输出相同的值

问题描述

有什么方法可以编写函数,以便当我调用它时,即使通过不同的参数传递,它仍然输出相同的值

我是 JavaScript 新手,最近在一次采访中被问到这个问题 -

编写一个函数 sum,当调用 sum(2)(3) 或 sum(2, 3) 时应该返回 5。

这可以单独完成如下

function sum(a){
  return function(b){
    return a+b
  }
}

或者

function sum(a, b){
  return a+b
}

如果我遵循第一个代码,它将不会执行 sum(a, b),当然第二个代码将不支持 sum(a)(b)。有什么方法可以合并这两个代码片段,以便它执行不管我怎么称呼它?

标签: javascriptclosurescurrying

解决方案


您需要检查传递了多少参数。如果通过了两个,则返回相加的值;否则,返回一个函数,该函数在调用时返回其参数加上闭包的参数:

const sum = (...args) => {
  if (args.length === 2) {
    return args[0] + args[1];
  }
  return arg => arg + args[0];
};

console.log(sum(2)(3));
console.log(sum(2, 3));

更一般地,您可以创建一个makeSum函数来处理要接受的参数总数是任意数字时:

const makeSum = totalArgCount => {
  const fn = (...args) => {
    if (args.length === totalArgCount) {
      return args.reduce((a, b) => a + b, 0);
    }
    return fn.bind(undefined, ...args);
  };
  return fn;
};

const sum2 = makeSum(2);
console.log(sum2(2)(3));
console.log(sum2(2, 3));

const sum4 = makeSum(4);
console.log(sum4(2)(3)(4)(5));
console.log(sum4(2, 3, 4)(5));


推荐阅读