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

标签 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) ); // 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/

相关文章:

javascript - 使用 checkDirty() 与多个 CKEditor 一起工作,以在离开页面之前提醒用户内容是否已更改

javascript - 查找所有未选中的复选框,并在 jquery 中单击按钮时仅突出显示未选中的复选框

javascript - 从对象数组中删除对象

javascript - 在页面顶部添加特定类到滚动代码

javascript - 选择没有特定 id、class、xpath 等的元素

javascript - jQuery on 方法与 ajax 响应

javascript - jQuery - 从父列表中删除选定的选项

javascript - JQuery 选择器 : How to get a img id that have an one and only one attribute

javascript - 未知的 GET 请求在 POST 请求后自动出现

c# - javascript通过后面的代码确认