Javascript 对使用toString方法和递归求和数字的函数的说明

Javascript 对使用toString方法和递归求和数字的函数的说明,javascript,Javascript,我正在学习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) );

我正在学习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
方法在这里到底做了什么,它是如何给出
f1
的结果的,等等?
我真的希望有人能解释这一点,因为我无法理解教程中的代码。如果问题是noob,请道歉。

记录函数结果时,它需要将结果转换为字符串。一些浏览器通过调用其
.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中不起作用。

我建议使用调试器逐行检查代码。然后您可以确切地看到代码在每一步中都在做什么。有很多教程介绍如何做到这一点
console.log
似乎正在调用函数的
toString
方法。测试:
函数f(){};f、 toString=()=>“abc”;控制台日志(f)。要了解更多关于
toString
,请查看和。请注意,firefox记录
function()
,并且不会自动使用toString,因此它似乎与环境有关。我也感谢您的解释,但有一点我仍然不清楚,我认为如果我们覆盖
toString
方法,每次我们尝试在控制台中记录某些内容时都会调用它,例如
sum(1)(2)
。确实如此,但我认为如果发生这种情况,如果已经调用了
toString
方法,甚至不会调用
函数f(b)
。当执行
toString
方法时,
函数f(b)
是如何调用的,原因是什么?如果您也能澄清这一点,我将非常感激。函数的参数在调用函数之前进行求值。因此,在调用
console.log()
之前,将计算
sum(1)(2)(3)(4)
f(4)
返回的值被传递到
console.log()
,然后它调用
toString()
。那么,当我只调用
sum(1)
时,如果还没有b值,我们如何第一次得到值呢。然后,也应该首先调用函数
f(b)
,并解决它,因为我们没有传递
b
参数,所以应该得到一个错误?我遗漏了什么?我已经用一个电话的详细解释更新了答案