面试官:实现 sum(1, 2)(3, 4)(5).sumOf() // 返回 15

296 阅读1分钟

要实现一个 sum 函数来满足这些需求,我们可以利用闭包和函数链式调用的概念。

  1. sum 函数应该返回一个可链式调用的函数,累积所有传入参数。
  2. 最后使用 sumOf() 方法来计算并返回累积的和。

以下是代码的实现:

function sum(...args) {
  // 内部保存所有参数
  let total = args;

  // 定义内部函数,接受额外参数并累加到总数
  function innerSum(...newArgs) {
    total = total.concat(newArgs);
    return innerSum;
  }

  // 定义 sumOf 方法来计算总和
  innerSum.sumOf = function() {
    return total.reduce((acc, val) => acc + val, 0);
  };

  return innerSum;
}

测试示例

console.log(sum(1, 2).sumOf());           // 输出 3
console.log(sum(1, 2)(3).sumOf());        // 输出 6
console.log(sum(1)(2, 3, 4).sumOf());     // 输出 10
console.log(sum(1, 2)(3, 4)(5).sumOf());  // 输出 15

工作原理

  • sum 函数在初次调用时接受一组参数并将其存储在 total 数组中。
  • innerSum 函数每次调用时会将新的参数追加到 total 数组中,并返回自身,允许链式调用。
  • sumOf() 方法调用时通过 reducetotal 中的所有数值累加起来并返回结果。