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

如何实现支持链式调用的add函数?

实现连续调用的加法函数(柯里化函数)

你遇到的这种add(1)(2)调用方式叫做函数柯里化,和你之前查的方法链式调用不是一回事——方法链式是对象调用方法后返回自身,而柯里化是函数每次接收部分参数后,返回一个新函数来接收剩余参数,靠闭包保存之前的参数状态。

基础实现(支持两次调用)

要满足add(1)(2) === 3,核心是让add(1)返回一个能接收第二个参数并计算总和的函数:

function add(a) {
  // 返回一个闭包函数,记住第一个参数a
  return function(b) {
    return a + b;
  };
}

// 测试验证
console.log(add(1)(2)); // 输出 3

扩展实现(支持N次链式调用)

如果需要支持更多次连续调用(比如add(1)(2)(3) === 6),可以让返回的函数继续保存累加值,同时通过重写valueOf/toString方法,让函数在需要转为数值/字符串时返回最终总和:

function add(a) {
  let total = a;
  
  // 定义内部函数用于后续调用
  function accumulator(b) {
    total += b;
    return accumulator; // 返回自身,实现链式调用
  }
  
  // 当需要获取数值结果时(比如隐式转换),返回累加的总和
  accumulator.valueOf = function() {
    return total;
  };
  
  // 字符串转换时也返回总和
  accumulator.toString = function() {
    return String(total);
  };
  
  return accumulator;
}

// 测试验证
console.log(add(1)(2)); // 3
console.log(add(1)(2)(3)); // 6
console.log(+add(5)(3)(2)); // 10(+号触发valueOf转换)

关键区别说明

你之前查的方法链式调用(比如C#里的)是对象方法链,比如new Person().SetName("Tom").SetAge(20),每次调用方法都返回对象本身;而这里的柯里化是函数链,每次调用函数返回新的函数(或可继续调用的函数),依赖闭包来持续保存状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:05:21