带任意数量括号的求和
重要性: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
附注:提示:您可能需要为您的函数设置自定义对象到基本类型的转换。
- 为了使整个过程正常工作,
sum
的结果必须是函数。 - 该函数必须在调用之间保留当前值。
- 根据任务,该函数在
==
中使用时必须变为数字。函数是对象,因此转换发生在本章节中所述的方式 对象到基本类型的转换,我们可以提供自己的方法来返回数字。
现在代码
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.toPrimitive
或 valueOf
进行转换。