JavaScript嵌套循环逐行运行逻辑解析及理解错误排查

错误原因
你推导错了两个核心点:
- 搞反了打印的变量:内层循环输出的是外层的
i,不是内层的j - 记错了循环边界:内层循环的判断条件是
j <= 3,不是你以为的j < 3,每次外层循环触发时,内层会跑满3轮,不是2轮。
逐行执行流程(还原原题代码)
这是一道经典JS循环笔试题,原题代码如下:
for (var i = 1; i <= 4; i++) { for (var j = 1; j <= 3; j++) { console.log(i); } }
逐步骤运行逻辑:
- 外层循环启动,初始化变量
i = 1 - 判断外层循环条件
i <= 4,1<=4结果为真,进入外层循环体 - 内层循环启动,初始化变量
j = 1 - 判断内层循环条件
j <=3,1<=3结果为真,进入内层循环体,执行打印语句输出当前i的值:1 - 执行内层循环自增语句
j++,j变为2 - 回到内层条件判断,2<=3为真,进入内层循环体,打印1
- j自增为3,判断3<=3为真,进入内层循环体,打印1
- j自增为4,判断4<=3为假,内层循环本轮结束,回到外层循环
- 外层循环执行自增语句
i++,i变为2 - 判断外层条件2<=4为真,重新进入外层循环体,内层循环再次初始化j=1,重复上述4-8的流程,连续打印3次2
- 按同样逻辑,i=3时连续打印3次3,i=4时连续打印3次4
- 最后i自增为5,判断5<=4为假,外层循环终止
所有输出按顺序拼接就是111222333444,和标准答案一致。
补充说明
你之前认为「外层每轮触发时内层j会重置为1」这个理解本身是对的——因为j的初始化语句写在内层for循环的声明位置,每次进入内层循环都会重新给j赋值为1。如果代码里打印的是j,最终输出会是123123123123,也不会是你推导的12121212,你算出这个结果是同时搞错了打印变量和循环边界两个条件导致的。
内容的提问来源于stack exchange,提问作者Dash
相关产品推荐
相关产品推荐

