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,两个循环有什么区别吗?
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,两个循环有什么区别吗?
第一个 打印完才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
队列是等主线程所以程序执行完毕之后在执行
第一个循环的条件是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。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
看如此讲解你是否能理解,希望能对你有所帮助:
第一个
第二个