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

JavaScript中参数数量未知的柯里化add函数实现方案

实现支持链式调用的灵活加法函数 add

嗨,这个问题挺有意思的,要实现一个既能单次传多个参数、又能链式调用的加法函数,核心思路是用闭包维护累加的总和,同时让返回的函数具备「可被求值」的能力。下面咱们一步步来拆解实现:

核心思路拆解

  • 用闭包保存累计的总和:每次调用函数时,把传入的所有参数都加到这个总和里,闭包能让这个总和在多次调用间保持状态。
  • 返回可继续调用的函数:每次调用后返回自身,这样就能实现链式调用。
  • 让函数能被当作数值使用:利用JavaScript的valueOf或toString方法,当函数需要被转换为原始值时(比如打印、参与运算),自动返回累计的总和。

具体代码实现

function add(...args) {
  // 初始化累计总和,把第一次传入的参数都加起来
  let total = args.reduce((acc, num) => acc + num, 0);

  // 定义内部函数,用于后续的链式调用
  const adder = (...nextArgs) => {
    // 把新传入的参数累加到总和里
    total += nextArgs.reduce((acc, num) => acc + num, 0);
    // 返回自身,实现链式调用
    return adder;
  };

  // 重写valueOf方法,当需要获取数值时返回总和
  adder.valueOf = () => total;
  // 重写toString,保证在字符串场景下也能正确输出
  adder.toString = () => String(total);

  return adder;
}

测试验证

咱们来测试题目里的两种场景:

console.log(add(1)(2)(3)); // 输出 6
console.log(add(1, 2)(3, 4)(5)); // 输出 15

甚至还支持更多灵活的调用方式:

console.log(add(1, 2, 3)(4)); // 10
console.log(add()(5)(6, 7)); // 18
console.log(add(2)(3) + 4); // 9 (参与运算也能正确工作)

原理说明

  1. 闭包的作用:total变量被内部的adder函数引用,所以每次调用adder时,都能访问并更新这个变量,实现跨调用的累加。
  2. 链式调用的实现:每次调用adder都会返回自身,所以可以一直链式调用下去,不断传入新的参数。
  3. 值的隐式转换:当我们尝试打印函数、或者让函数参与数值运算时,JavaScript会自动调用valueOf(或toString)方法,这时候就返回了累计的总和,所以能得到正确的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:46