You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中实现sum(2)(3)(4)...(n)链式调用求累加和的方法

实现支持无限链式调用的sum函数

这个问题我之前也碰到过!你当前的sum函数只能处理两次调用,因为每次返回的函数做完一次加法就直接返回结果了,没办法继续累积后续传入的数值。要实现sum(2)(3)(4)...(n)这种无限链式调用的求和,咱们可以利用JavaScript中函数的隐式类型转换特性来解决,下面给你两种实用方案:

方案一:利用隐式转换自动返回总和

这种方案不需要额外调用无参方法,当你需要获取结果时(比如打印、参与运算),JS会自动帮你转换为累加的总和:

function sum(a) {
  let total = a;
  
  const add = function(b) {
    total += b;
    return add;
  };
  
  // 重写toString,当函数被转为字符串时返回总和
  add.toString = () => total;
  // 重写valueOf,确保数值场景下也能正确返回总和
  add.valueOf = () => total;
  
  return add;
}

使用示例

// 直接打印链式调用的结果
console.log(sum(2)(3)(4)); // 输出 9
console.log(sum(1)(2)(3)(4)(5)); // 输出 15

// 参与数值运算也没问题
console.log(sum(5)(3) + 2); // 输出 10
console.log(sum(10)(-5) * 2); // 输出 10

原理说明

  • 外层sum函数接收第一个参数,初始化累加器total。
  • 内部的add函数每次接收新参数,把它加到total上,然后返回自身,这样就能一直链式调用下去。
  • 重写toString和valueOf是核心:当JS需要把这个函数转为原始值(比如字符串、数字)时,会自动调用这两个方法,返回我们累积的总和。

方案二:支持无参调用直接获取结果

如果你更习惯通过最后加个()来得到结果,可以在内部函数里判断是否传入参数:

function sum(a) {
  let total = a;
  
  const add = function(b) {
    // 如果没有传参数,直接返回当前总和
    if (typeof b === 'undefined') {
      return total;
    }
    total += b;
    return add;
  };
  
  // 同样保留隐式转换的支持
  add.toString = () => total;
  add.valueOf = () => total;
  
  return add;
}

使用示例

// 无参调用获取结果
console.log(sum(2)(3)(4)()); // 输出 9
// 当然也支持之前的隐式转换方式
console.log(sum(5)(3)); // 输出 8

这样两种方式都能满足你的需求,看你更喜欢哪种风格啦~

内容的提问来源于stack exchange,提问作者vishal kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:58:56