如何用局部变量实现JavaScript柯里化求和函数?
改造链式调用sum函数,移除全局变量
直接上改造后的代码,完全保留你习惯的调用写法,同时把累加值封装成局部变量:
function sum(a) { // 局部累加变量,仅当前链式调用链可用 let res = a; // 内部闭包函数处理后续链式调用 function inner(b) { if (b !== undefined) { res += b; return inner; // 返回自身维持链式调用 } else { return res; // 无参数时返回最终结果 } } return inner; } console.log(sum(1)(2)(3)(4)(5)(6)()); // 输出 21
改造思路说明
原来的全局变量res会导致所有sum调用共享同一个值,比如你先调用sum(1)(2)()得到3,再调用sum(3)()会得到6,这明显不符合预期。
现在的写法用闭包解决了这个问题:
- 每次调用
sum(初始值)时,都会创建一个独立的局部变量res,只属于当前这条链式调用链。 - 返回的
inner函数会“记住”这个res,后续的链式调用(比如(2)、(3))都是调用inner,累加操作只会修改当前链的res,不会和其他调用冲突。 - 调用方式和你原来的写法完全一致:初始传值启动链式调用,最后加
()获取结果。
测试一下独立调用的情况,结果互不干扰:
console.log(sum(1)(2)(3)()); // 6 console.log(sum(4)(5)()); // 9
内容的提问来源于stack exchange,提问作者ABGR
相关产品推荐
相关产品推荐

