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

