我正在学习 JS,想了解一下我遇到的这个例子:
function sum(a) {
let currentSum = a;
function f(b) {
currentSum += b;
return f;
}
f.toString = function() {
return currentSum;
};
return f;
}
console.log( sum(1) ); // f 1
console.log( sum(1)(2) ); // f 3
console.log( sum(5)(-1)(2) ); // f 6
console.log( sum(6)(-1)(-2)(-3) ); // f 0
console.log( sum(0)(1)(2)(3)(4)(5) ); // f 15
我不明白的是,当我想既然我们只返回第一次调用的函数时,这个函数如何仅通过调用 sum(1)
返回 antyhing 呢?
另外,这个 toString
方法在这里到底做什么,以及它如何给出 f 1
等结果?
我真的希望有人能够解释这一点,因为我无法理解教程中这段代码的内容。如果问题是针对菜鸟的,请道歉。
最佳答案
当您记录函数的结果时,它需要将该结果转换为字符串。某些浏览器通过调用其 .toString()
方法来执行此操作。
sum()
返回一个函数,该函数将其参数添加到闭包中的 currentSum
变量中。这就是链式函数调用累积总数的方式。但此函数还有一个自定义 .toString()
方法,该方法返回计算出的总和,因此这就是记录的内容。
我们可以像这样分解其中一条长链:
console.log(sum(1)(2)(3));
相当于:
temp1 = sum(1); // sets currentSum to 1, returns f
temp2 = temp1(2); // sets currentSum to 3, returns f
temp3 = temp2(3); // sets currentSum to 6, returns f
console.log(temp3); // calls f.toString(), which returns currentSum, so 6 is printed
这是一个可爱的技巧,但它不是允许这样的链式调用的有用的通用方法。这取决于这样一个事实:所有调用完成后,最终结果将被需要字符串的东西使用。它取决于 console.log()
的浏览器特定功能 - 它在 Firefox 中不起作用。
关于javascript - 使用 toString 方法和递归对数字求和的函数说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47359833/