for循环变量i在内部代码未执行完前提前递增,循环异常求助
问题:for循环提前截断且变量i意外递增的原因分析
我在以下for循环的内部代码中添加了4个console.log语句:
for(i=0;i<selectorStrArr.length;i++){ console.log(i) const selectorStr = selectorStrArr[i] const selectorNameProps = this.splitNameProps(selectorStr) console.log(i) const selectorNameArr = selectorNameProps.nameArr const selectorProps = this.getProps(selectorNameProps.propsStr) console.log(i) for(n=0;n<selectorNameArr.length;n++){ //适配样式对象上的多个选择器 const name = selectorNameArr[n] if(!selectorObj[name]) selectorObj[name] = {} Object.assign(selectorObj[name], selectorProps) //若类名重复,使用assign而非覆盖 } console.log(i) }
控制台输出结果如下:
0 1 2 2
目前发现该for循环被提前截断,且变量i在内部代码执行完成前就被递增了,但内部代码中没有手动修改i的操作,请问这可能是什么原因导致的?
可能的原因及解决办法
- 变量未声明导致全局污染:你代码里的
i和n都没有用let/const声明,属于全局变量。如果splitNameProps或getProps函数内部也使用了同名全局变量i(比如不小心写了i++或重新赋值),就会直接篡改外层循环的i值,导致循环提前跳变。 - 其他全局脚本干扰:页面中其他脚本如果也在操作全局变量
i,同样会影响这个循环的执行逻辑。 - 异步操作影响(可能性较低):如果
splitNameProps或getProps包含异步逻辑(如定时器、网络请求),循环会先走完同步流程,异步回调执行时i已经被递增,但从当前控制台输出看这种情况概率不高,仍可排查。
解决建议
- 给循环变量加上块级作用域声明:把
for(i=0;...)改成for(let i=0;...),内部的for(n=0;...)改成for(let n=0;...),避免变量全局污染。 - 检查
splitNameProps和getProps函数内部,确认是否存在修改全局i的代码。 - 排查页面其他脚本,看是否有操作全局变量
i的逻辑。
内容的提问来源于stack exchange,提问作者Jacob Winter
相关产品推荐
相关产品推荐

