JavaScript递归函数多次传入相同参数报错及代码优化求助
问题修复与代码优化方案
1. 重复同参数调用死循环问题修复
问题核心是rndObjVal变量声明在函数外部作用域,每次调用没有重置,上一次调用的残留数据和本次逻辑冲突,最终导致for-in循环无法退出,对应修复方案:
- 优先将
rndObjVal的声明移到函数内部,每次调用函数时都初始化一个全新的空对象,示例如下:
function generatePhrase(ctgNo) { const rndObjVal = {} // 每次调用创建新对象,完全隔离不同调用的数据 // 剩下的原有逻辑 }
- 如果逻辑需要必须在函数外部声明该变量,可在函数入口第一行添加清空逻辑:
rndObjVal = {},每次调用先清空上一次的残留数据。 - 如果是递归层级需要共享该对象,可将对象作为递归参数传递,避免依赖全局变量。
2. eval()替代优化方案
你当前使用eval大概率是为了通过变量名字符串获取对应的数据集,完全可以用统一数据集映射对象替代,没有任何安全风险,性能也更高:
- 先把所有分散的数据集变量整合到一个对象中:
// 原有分散声明的变量 // const ctg_ptr = [...] // const mA_2 = [...] // const vrb_better = [...] // 优化为统一映射管理 const DATASET = { ctg_ptr: [/* 原有ctg_ptr的内容 */], mA_2: [/* 原有mA_2的内容 */], vrb_better: [/* 原有vrb_better的内容 */], // 其余所有数据集都按key-value形式放到这个对象中 }
- 原有调用
eval(变量名字符串)的位置,直接替换为DATASET[变量名字符串]即可,完全实现相同的取值效果。
3. 补充优化建议
- 给递归函数添加最大深度限制,避免极端场景下栈溢出,比如设置最多递归10层就返回兜底内容。
- 随机选择数组项的逻辑封装为独立工具函数
getRandomItem(arr),提升代码复用性。 - for-in遍历对象时添加
hasOwnProperty判断,避免遍历到原型链属性导致逻辑异常:
for (const key in obj) { if (obj.hasOwnProperty(key)) { // 原有处理逻辑 } }
内容的提问来源于stack exchange,提问作者ham17
相关产品推荐
相关产品推荐

