带任意数量括号的求和
重要性: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
进行转换。