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

如何编写可连续单参数调用的JavaScript链式函数?附示例

如何实现可连续单参数调用的JavaScript函数

这个问题本质是函数柯里化的典型应用——我们需要让函数每次接收一个参数后,返回一个能继续接收下一个参数的函数,同时最终能返回累积的计算结果。下面给你两种实用的实现方案:

方案一:基于闭包累积值(易懂版)

这种方案用闭包保存累积的总和,通过重写函数的toString和valueOf方法让函数能被当作数值使用:

function sum(a) {
  // 用闭包保存累积的总和
  let total = a;

  // 定义内部函数,用来接收后续参数
  function add(b) {
    total += b;
    // 返回自身,实现链式调用
    return add;
  }

  // 重写toString:当函数被转为字符串时返回总和
  add.toString = function() {
    return total;
  };

  // 重写valueOf:当函数参与数值运算时返回总和
  add.valueOf = function() {
    return total;
  };

  return add;
}

测试效果

console.log(sum(1)(2)); // 输出 3
console.log(sum(1)(2)(3)); // 输出 6
console.log(sum(5)(3)(2) + 10); // 输出 20

方案二:ES6递归写法(简洁版)

利用ES6箭头函数和递归,代码更紧凑:

const sum = a => {
  // 递归返回新的sum函数,参数是累积后的总和
  const add = b => sum(a + b);
  // 重写valueOf,直接返回当前累积的数值
  add.valueOf = () => a;
  return add;
};

测试效果

console.log(sum(2)(3)(5)); // 输出 10
console.log(+sum(1)(1)(1)(1)); // 输出 4(+号触发valueOf)

核心原理说明

  • 闭包/递归用来保存每次传入的参数累积值,让后续调用能访问到之前的计算结果。
  • 重写toString和valueOf是关键:因为每次调用后返回的是函数,当我们需要获取它的数值结果时(比如打印、运算),JavaScript会自动调用这两个方法,把函数转为对应的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:33:42