可多次调用的JS累加函数重复调用值异常问题修复咨询
修复JavaScript累加函数的状态共享问题
你的问题核心是所有函数调用共享了同一个闭包变量sum,每次调用sumFour都会修改这个sum的值,导致后续调用的初始值不再是你期望的4。要解决这个问题,需要让每个函数实例持有独立的总和状态,每次调用都返回一个新的闭包实例,而非修改原有的状态。
修改后的代码
'use strict'; function myAdd(...args) { // 内部函数:创建持有当前总和的累加函数实例 function createAddFn(currentSum) { const addFn = (...newArgs) => { // 计算新的总和:当前值 + 新传入的所有参数之和 const updatedSum = currentSum + newArgs.reduce((acc, val) => acc + val, 0); // 返回新的累加函数实例,携带更新后的总和 return createAddFn(updatedSum); }; // 重写valueOf,转成数值时返回当前总和 addFn.valueOf = () => currentSum; return addFn; } // 计算初始参数的总和,生成第一个累加函数实例 const initialSum = args.reduce((acc, val) => acc + val, 0); return createAddFn(initialSum); } // 测试验证 let sumFour = myAdd(2)(2); console.log(+sumFour(2)); // 输出6 console.log(+sumFour(2)); // 输出6
代码逻辑说明
- 独立状态的闭包:
createAddFn会为每个累加函数实例创建独立的currentSum变量,不同实例之间的状态互不干扰。 - 每次调用生成新实例:当你调用
sumFour(2)时,会基于sumFour持有的4计算出6,然后返回一个持有6的新函数实例,而原sumFour的currentSum依然是4,所以第二次调用sumFour(2)还是会得到6。 valueOf的作用:保证当用+运算符转换函数实例时,能返回当前的总和数值。
内容的提问来源于stack exchange,提问作者Ahmad Wehbe
相关产品推荐
相关产品推荐

