for循环中定时器打印值的问题?

for(var i = 1; i <= 5; i++){

setTimeout(function () {
    console.log(i);
}, 1000);

}
这个循环中为什么打印的是5个6?而不是5个5?
for(var i=1; i<=5; i++) {

var a = i;
setTimeout(function () {
    console.log(a);
}, 1000);

}
这个循环中打印5个5,两个循环有什么区别吗?

阅读 4.9k
7 个回答

看如此讲解你是否能理解,希望能对你有所帮助:
第一个

//执行顺序像这样
var i;
for (i = 0; i <= 5; i++) { //每次运行i都在递增,当运行到6时,不满足条件跳出

}
console.log(i); //此时打印i为6,只是使用了setTimeout会打印多次而已

第二个

//执行顺序像这样
var a;
for (var i = 0; i <= 5; i++) {  //和上面差不多,就一点,i为6不满足条件时不执行里面的代码,这样a就仅保留上一次i的值,而不会变为6
    a = i;
}
console.log(a); //和第一个一样的

第一个 打印完才i++ 退出循环时i=6 然后再执行打印
第二个 打印完才i++ 第二个循环打印的是a 最后一次a=5 i++后等于6退出循环 然后再执行settimeout里的log a a=5自然打印5个a啊

本质都是一样的 for循环因为是同步执行 所以会先执行完毕

完整解释一下

问题关键  var  for循环   setTimeout 
首先 var作用域是这个函数   for循环是一瞬间完成的  而setTimeout是存在队列中的 当他执行的时候已经i为6了
i为6不满足条件  但是他现在执行了 console.log(i) 结果就是5次6

第二个  同样道理只不过他赋值与a为5  到6没有进入循环从而赋值 所以5次5

队列是等主线程所以程序执行完毕之后在执行

https://www.cnblogs.com/wangw...

第一个循环的条件是i<=5,也就是说i==5的时候最后一次进入循环,之后进入i++,i变成6,再次判断不进入循环,因此i==6,打印的是5个6。
第二个循环大概是写错了吧,你是想写console.log(a)吧,不然和第一个循环没有区别,如果是a的话那么就是在最后一次循环中i==5,为a赋值,a==5,之后打印5个5.

第一个。 当执行console.log(i) 的时候: i = 6, a is undefined
第二个。 当执行console.log(a) 的时候: i = 6, a = 5.

先弄懂for 循环。

for循环是在什么时候跳出的?i = 6 时。
i = 5 时 a = 5;
i = 6 时循环跳出, for循环内部没有再次执行,a = 5;
所以setTimeout执行时 i = 6, a = 5。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题