JavaScript中同一cumulativeSum累计和函数处理两数组结果不同问题咨询
问题解答
1. cumulativeSum 函数运行原理
这段代码是**闭包+立即执行函数(IIFE)**的组合写法,拆解逻辑如下:
- 外层
(sum => value => sum += value)(0)是立即执行函数,调用时传入初始值0给参数sum,执行后返回内层箭头函数value => sum += value - 由于闭包特性,内层函数会永久持有外层作用域中
sum变量的引用,sum不会被JS垃圾回收机制销毁,每次调用内层函数时,都会直接修改同一个sum变量的值,返回累加后的结果。
2. 两次处理结果不一致的原因
你复用了同一个cumulativeSum实例处理两个数组:
- 第一次遍历
peopleInLine数组计算累计和时,闭包内的sum值已经被累加到了该数组的总和950,不再是初始的0 - 第二次遍历
changeRequired数组时,累加操作是从sum=950的基础上开始计算的,因此得到的所有结果都比预期值多了950,最终输出错误。
你可以验证下错误结果:1125 - 950 = 75、1125 - 950 =75、1150-950=100,和你预期的输出完全匹配。
3. 修复方案
需要计算多组累计和时,要分别创建独立的cumulativeSum实例,每个实例持有独立的初始值为0的sum变量:
// 计算收入累计的独立实例 const cumulativeSumProfit = (sum => value => sum += value)(0); let cumulativeProfit = peopleInLine.map(cumulativeSumProfit); // ...中间的changeRequired生成逻辑不变 // 计算支出累计的独立实例,sum初始值为0 const cumulativeSumOutgoings = (sum => value => sum += value)(0); let cumulativeOutgoings = changeRequired.map(cumulativeSumOutgoings);
内容的提问来源于stack exchange,提问作者NicolaHearn
相关产品推荐
相关产品推荐

