为何for循环写i+7时代码卡死但指定次数循环可正常运行?
问题根因
你遇到的无报错无限循环问题,核心是对JS中for循环的执行逻辑、表达式的赋值特性理解有偏差,先看你出问题的代码片段:
for (var i = 0; i < 300; i+7) { //30:00 var random_x = getRandomInt(0, width-1); var random_y = getRandomInt(0, height-1); var sample_color = img.colorAt(random_x, random_y); // 其余循环逻辑 }
JS的for循环三个表达式的执行规则是固定的:
- 初始化表达式(第一个位置):仅在循环启动前执行一次,你这里是
var i = 0,执行完i初始值为0 - 循环条件(第二个位置):每轮循环开始前判断,结果为真就进入循环体执行代码,为假就退出循环
- 增量表达式(第三个位置):每轮循环体执行完毕后自动执行,之后回到第二步重新判断条件
你写的i+7属于无副作用的计算表达式:它只会计算出「i当前值加7」的结果,不会把这个结果重新赋值给变量i。也就是说不管循环跑多少轮,i的值始终停留在初始的0,0 < 300的条件永远成立,循环永远不会终止,直接卡死。
至于为什么没有任何报错:JS语法不会限制for循环第三个位置的表达式类型,哪怕你在这里写和循环变量完全无关的代码(比如1+1、console.log('test'))都是语法合法的,引擎不会抛出错误,只会按规则执行表达式,这类纯逻辑bug本来就不会触发语法报错,排查难度本来就高。
你提到其他场景下写i+7可以正常运行,是因为那些场景只需要用到「i加7」的计算结果,不需要修改i本身的值,和for循环增量位需要更新循环变量、推进终止条件达成的作用完全不匹配,不是写法本身错了,是放错了位置。
写法修正说明
- 如果你需要每次循环i自增1,你现在改的
i++是正确的,这是i = i + 1的简写,执行后会直接修改i的值 - 如果你原本的需求是每次循环i步进7,正确写法是
i += 7,等价于i = i + 7,会把计算结果赋值回i,最终会走到i>=300的条件终止循环 - 只要是放在for循环增量位的代码,如果要推动循环走向终止,必须包含对循环变量的赋值操作,只做计算不赋值的写法都会触发无限循环。
内容的提问来源于stack exchange,提问作者BlueHits
相关产品推荐
相关产品推荐

