返回课程

带任意数量括号的求和

重要性:2

编写一个名为 sum 的函数,其工作方式如下

sum(1)(2) == 3; // 1 + 2
sum(1)(2)(3) == 6; // 1 + 2 + 3
sum(5)(-1)(2) == 6
sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15

附注:提示:您可能需要为您的函数设置自定义对象到基本类型的转换。

打开带有测试的沙盒。

  1. 为了使整个过程正常工作,sum 的结果必须是函数。
  2. 该函数必须在调用之间保留当前值。
  3. 根据任务,该函数在 == 中使用时必须变为数字。函数是对象,因此转换发生在本章节中所述的方式 对象到基本类型的转换,我们可以提供自己的方法来返回数字。

现在代码

function sum(a) {

  let currentSum = a;

  function f(b) {
    currentSum += b;
    return f;
  }

  f.toString = function() {
    return currentSum;
  };

  return f;
}

alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15

请注意,sum 函数实际上只执行一次。它返回函数 f

然后,在每次后续调用中,f 将其参数添加到总和 currentSum 中,并返回自身。

f 的最后一行没有递归。

以下是递归的样子

function f(b) {
  currentSum += b;
  return f(); // <-- recursive call
}

而在我们的例子中,我们只是返回了函数,并没有调用它。

function f(b) {
  currentSum += b;
  return f; // <-- does not call itself, returns itself
}

这个 f 将在下次调用中被使用,再次返回自身,只要需要就可以。然后,当它被用作数字或字符串时 - toString 将返回 currentSum。我们也可以在这里使用 Symbol.toPrimitivevalueOf 进行转换。

在沙盒中打开带有测试的解决方案。