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

如何实现支持多参数链式调用的JavaScript累加函数?

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

嘿,这个需求很常见也挺巧妙的!要把只能两次调用的add改成支持无限链式,核心是让每次返回的函数既能继续接受参数链式调用,又能在需要时输出累加总和。下面给你两种实用的实现方式:

基础实现(ES5风格)

function add(a) {
  // 定义内部函数,用于接收下一个参数并递归累加
  const sumFunction = function(b) {
    return add(a + b);
  };

  // 当函数需要转换为原始值时(比如打印、运算),返回当前累加值
  sumFunction.valueOf = function() {
    return a;
  };

  // 处理字符串转换场景,比如直接console.log的时候
  sumFunction.toString = function() {
    return String(a);
  };

  return sumFunction;
}

工作原理拆解

  • 每次调用add(n)时,都会返回一个新的sumFunction函数,这个函数接受下一个参数b后,会递归调用add并传入a + b,从而实现无限链式调用。
  • 关键的valueOf和toString是JavaScript函数的内置方法:当函数需要被转换为原始值(比如参与数学运算、直接打印)时,JS引擎会自动调用这两个方法,我们在这里让它们返回当前的累加总和,这样就能得到最终结果。

简洁实现(ES6箭头函数)

如果喜欢更简洁的写法,用ES6箭头函数可以压缩成这样:

const add = a => {
  const fn = b => add(a + b);
  fn.valueOf = () => a;
  return fn;
};

调用示例

console.log(add(1)(2)); // 3
console.log(add(1)(2)(3)); // 6
console.log(add(1)(2)(3)(4)); // 10

// 参与数学运算也完全没问题
console.log(add(1)(2)(3) + 5); // 11
console.log(Number(add(5)(6)(7))); // 18

为什么原函数做不到?

原函数function add(a) { return function (b) { return a + b } }只能返回一个接收b的函数,且这个函数直接返回结果,没有递归调用的逻辑,也没有处理函数转原始值的机制,所以最多只能链式两次调用。


内容的提问来源于stack exchange,提问作者Twitter khuong291

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:14:58