为什么JavaScript调用document.write输出的循环变量i值与预期不一致
代码运行结果差异原因解析
你代码中重复三次声明scores变量的操作不会影响运行结果,用var重复声明同一变量时,除了第一次声明,后续声明会被直接忽略,三次赋值内容一致,所以最终scores值不变。
1. 为什么最终输出的i值为3
JS中for循环的执行顺序为:初始化变量 → 校验终止条件 → 条件成立执行循环体 → 执行计数器自增 → 再次校验终止条件,循环完全终止的前提是终止条件判定不成立。
你代码中数组长度为3,终止条件为i < 3:
- 第1轮循环:i=0,判定0<3成立,执行循环体,i自增为1
- 第2轮循环:i=1,判定1<3成立,执行循环体,i自增为2
- 第3轮循环:i=2,判定2<3成立,执行循环体,i自增为3
- 再次判定3<3不成立,循环终止,此时i的最终值就是3。
你把document.write放在循环外部,读取的是循环完全结束后的i值,自然得到3。
2. 为什么没有逐轮输出i和对应msg内容
你所有的输出操作都放在了循环结束之后,循环执行过程中你只是在不断往msg变量里追加内容,没有做任何输出操作。等三轮循环全部执行完,你才调用了一次document.write,当然只会输出一次最终的i值和拼接完成的完整msg。
如果要实现你预期的逐轮输出效果,需要把输出语句放到循环体内,每轮循环都执行一次输出:
for (i = 0; i < arrayLength; i++) { roundNumber = i + 1; msg = ' Round ' + roundNumber + ': ' + scores[i] + '<br>'; document.write('<h1>' + i + msg + '</h1>') }
3. 和Python的差异说明
这个表现并不是JS和Python的语言差异,你如果用Python写相同逻辑(把打印语句放在循环外部),得到的结果和JS完全一致:
scores = [24, 32, 47] array_len = len(scores) msg = '' i = 0 for i in range(array_len): round_num = i + 1 msg += f' Round {round_num}: {scores[i]}\n' print(i, msg) # 输出结果为: # 3 Round 1: 24 # Round 2: 32 # Round 3: 47
你之前在Python中得到逐轮输出的结果,应该是你习惯把打印语句写在了循环内部。
补充优化建议
如果要避免循环计数器泄露到外部作用域导致误读,可以用ES6的let关键字在for循环括号内声明计数器:
for(let i = 0; i < arrayLength; i++) { // 循环逻辑 } // 此处访问i会直接报错,避免误读
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

