面试题:如何实现可无限柯里化、空参调用时终止的add累加函数
任意次数累加的柯里化函数实现
你给出的示例是写死三层嵌套的固定参数柯里化实现,只能接收3个参数。要扩展为任意次数调用,核心是利用闭包存储累计值,每次非空传参时返回函数自身,空参调用时返回累计结果即可。
实现代码
function add(initVal) { // 闭包存储累加总和,兼容首次调用无参场景 let total = initVal ?? 0; function calc(nextVal) { // 空参数调用时返回累计结果,终止调用链 if (nextVal === undefined) { return total; } // 非空参数则累加,继续返回自身支持链式调用 total += nextVal; return calc; } return calc; }
如果需要兼容ES2020以下的运行环境,可以把
initVal ?? 0替换为initVal === undefined ? 0 : initVal。
测试示例
add(1)(2)(3)()→ 返回6add(10)(20)(30)(40)()→ 返回100add(5)()→ 返回5add()()→ 返回0
实现原理
- 首次调用
add时初始化闭包变量total存储初始值,返回内部计算函数calc - 每次调用
calc时如果传入参数,就将参数值累加到total,再返回calc本身,支持无限链式调用 - 当调用
calc没有传参时,直接返回累计的total值,结束整个调用流程
内容的提问来源于stack exchange,提问作者shura
相关产品推荐
相关产品推荐

