JavaScript递归干扰嵌套数组for循环遍历的问题排查
递归遍历嵌套数组时无限循环的原因及修复方案
你的猜测完全正确,问题核心就是循环变量i的作用域问题。
问题根源
代码里的i没有用let/var声明,导致它成为了全局变量。当递归调用loop_checker时,内层函数的循环会直接修改这个全局的i值:
- 外层循环执行到
i=4(对应测试数组里的子数组),进入递归 - 内层循环的
i从0开始计数,递归结束后,全局i已经变成了3(内层数组长度为3,循环结束时i等于3) - 回到外层循环,
i继续自增到4,又会重复处理第5个元素,最终陷入无限循环
修复方案
只需要给循环里的i加上let声明,把它限定在当前函数的作用域内,这样递归时内层的i和外层的i互不干扰:
function loop_checker(background_check) { let loop_condition = false let count = background_check.length // 用let声明i,将作用域限定在当前循环和函数内 for (let i=0;i<count;i++) { if (typeof background_check[i] === 'object') { let x = loop_checker(background_check[i]) if (x === true) { loop_condition = true } } else if (background_check[i] === 0) { loop_condition = true } } return loop_condition }
额外优化(可选)
一旦找到0就可以提前返回,不用继续遍历,提升函数效率:
function loop_checker(background_check) { let count = background_check.length for (let i=0;i<count;i++) { const current = background_check[i]; if (typeof current === 'object') { // 递归找到0直接返回true if (loop_checker(current)) { return true; } } else if (current === 0) { // 找到0立即终止遍历返回 return true; } } // 遍历完未找到0,返回false return false; }
内容的提问来源于stack exchange,提问作者engef2018
相关产品推荐
相关产品推荐

