如何在循环外正确定义函数?OnlyOffice宏函数调用异常排查
问题分析与解决方案
你的问题核心在于外部变量的状态留存:
- 第一个代码里,
MQty和MPkg是在闭包最外层声明的,第一次循环调用MaxPackage后,MQty会保留当前Pkg的最大值,后续循环时不会自动重置为0。如果新的Pkg里所有数值都小于上一次的MQty,函数就不会更新结果,导致逻辑失效。 - 第二个代码每次都重新声明
MQty为0,相当于每次计算前都重置了初始状态,所以能正确得到当前Pkg的最大值。
下面是几种可行的修复方案:
方案1:每次循环前重置状态
在Waybill循环内部、调用MaxPackage之前,手动重置最大值相关变量的初始值:
(function SplitByPalletsV2() { let MPkg; let MQty = 0; let Pkg = new Map(); let PQty = 0; Pkg.clear(); ///... (填充Pkg的代码) for (let [key, value] of Waybill) { ///... 填充当前循环的Pkg map // 重置最大值相关变量 MQty = 0; MPkg = undefined; // 调用函数 MaxPackage(); // 此处可使用MPkg和MQty的结果 } function MaxPackage() { for (let [key6, value6] of Pkg) { const numValue = Number(value6); if (numValue > MQty) { MQty = numValue; MPkg = key6; } } } })();
方案2:让函数独立,不依赖外部变量
把Pkg作为参数传给函数,让函数直接返回最大值和对应的key,完全避免外部状态干扰,代码更健壮:
(function SplitByPalletsV2() { let Pkg = new Map(); let PQty = 0; Pkg.clear(); ///... (填充Pkg的代码) for (let [key, value] of Waybill) { ///... 填充当前循环的Pkg map // 调用函数并获取结果 const { maxQty, maxPkg } = MaxPackage(Pkg); // 此处使用maxQty和maxPkg } function MaxPackage(pkgMap) { let maxQty = 0; let maxPkg; for (let [key6, value6] of pkgMap) { const numValue = Number(value6); if (numValue > maxQty) { maxQty = numValue; maxPkg = key6; } } return { maxQty, maxPkg }; } })();
方案3:利用数组方法简化计算
可以用Array.from把Map转成数组,再用reduce直接计算最大值,省去单独写函数的步骤:
(function SplitByPalletsV2() { let Pkg = new Map(); let PQty = 0; Pkg.clear(); ///... (填充Pkg的代码) for (let [key, value] of Waybill) { ///... 填充当前循环的Pkg map // 直接计算最大值 const [maxPkg, maxQty] = Array.from(Pkg).reduce((prev, [key, val]) => { const numVal = Number(val); return numVal > prev[1] ? [key, numVal] : prev; }, [undefined, 0]); // 此处使用maxPkg和maxQty } })();
内容的提问来源于stack exchange,提问作者IvanSTV
相关产品推荐
相关产品推荐

