JavaScript中如何实现SEO达标奖金发放代码仅执行一次
问题修正方案
原有代码核心问题
- 第二档达标条件写反:规则要求
st≥20触发第二档,原有代码写为st<=20,逻辑完全不符合需求 - 缺少发放状态前置校验:每次调用只要满足st阈值就直接返回奖金,没有先判断对应奖金是否已经发放过,导致重复触发
- 直达20阈值的场景逻辑缺失:直接达到st≥20时没有同时标记两笔奖金均已发放,后续可能重复触发第一档发放逻辑
修正后代码实现
使用闭包存储发放状态,避免全局变量污染和外部篡改,逻辑覆盖所有边界场景:
// 闭包保留奖金发放状态,仅暴露计算函数 const calculateSEOPrize = (() => { let prize1Issued = false; // 15≤st<20档位奖金发放状态 let prize2Issued = false; // st≥20档位奖金发放状态 return (st) => { // 两笔奖金均已发放,直接返回0 if (prize1Issued && prize2Issued) return 0; // 处理st≥20的场景 if (st >= 20) { // 两笔都未发放,一次性发放6000 if (!prize1Issued && !prize2Issued) { prize1Issued = true; prize2Issued = true; return 6000; } // 仅发放过第一笔,发放第二笔3000 if (prize1Issued && !prize2Issued) { prize2Issued = true; return 3000; } return 0; } // 处理15≤st<20的场景,第一笔未发放时触发 if (st >= 15 && st < 20 && !prize1Issued) { prize1Issued = true; return 3000; } // 其余未达标场景返回0 return 0; }; })();
调用示例
calculateSEOPrize(13) // 0 未达标 calculateSEOPrize(17) // 3000 发放第一笔 calculateSEOPrize(19) // 0 第一笔已发放 calculateSEOPrize(22) // 3000 发放第二笔 calculateSEOPrize(25) // 0 所有奖金已发放 // 直接达标st≥20场景 calculateSEOPrize(21) // 6000 一次性发放两笔 calculateSEOPrize(16) // 0 所有奖金已发放
内容的提问来源于stack exchange,提问作者Noname Taco
相关产品推荐
相关产品推荐

