如何实现支持未知次数链式调用的JavaScript累加函数?
问题分析与解决
原代码报错的核心原因:
- 传入参数
b时,调用adder(a + b)但未返回该函数,导致链式调用的下一次操作拿到的是undefined,触发“不是函数”的错误 - 无参数调用时,
b为undefined,a + b会得到NaN,逻辑错误 - 未用闭包维护持续的累加状态,每次调用
adder都是独立的参数值,无法实现持续累加
正确实现如下,用闭包保存累加总和,返回的函数根据是否有参数决定继续链式调用还是返回结果并清零:
function makeAdder() { let total = 0; return function adder(num) { // 判断是否传入有效数字参数 if (typeof num === 'number') { total += num; // 返回自身以支持链式调用 return adder; } else { // 无参数时返回当前总和,同时重置累加值 const result = total; total = 0; return result; } }; } // 测试示例 const adder = makeAdder(); console.log(adder(2)(3)(4)() === 9); // true console.log(adder(5)() === 5); // true,验证清零功能
也可以用更简洁的写法,利用函数自身属性维护状态:
function makeAdder() { function adder(num) { if (num !== undefined) { adder.total = (adder.total || 0) + num; return adder; } const res = adder.total || 0; adder.total = 0; return res; } return adder; }
内容的提问来源于stack exchange,提问作者Dukeofduke
相关产品推荐
相关产品推荐

