如何实现支持链式调用的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
相关产品推荐
相关产品推荐

