一个很经典的闭包题
for (var i = 1; i <= 5; i++) {
(function a(i) {
setTimeout(function() {
alert(i);
}, 1000);
})(i);
}
按理说,应该弹出1 2 3 4 5 ,但是实际弹出的却是乱序的。
换成console.log(i)就是1 2 3 4 5。
这是为什么呢?
一个很经典的闭包题
for (var i = 1; i <= 5; i++) {
(function a(i) {
setTimeout(function() {
alert(i);
}, 1000);
})(i);
}
按理说,应该弹出1 2 3 4 5 ,但是实际弹出的却是乱序的。
换成console.log(i)就是1 2 3 4 5。
这是为什么呢?
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
因为
alert
会阻塞进程第一个弹出的必定是
1
,弹出的时候如果你不点击确定,那么就回一直阻塞着,而这时所有的后续代码和回调函数都不会在执行。同步代码执行完成后,后生成5个定时器,在弹出1等待你点击确定时,后面的所有的定时器都已经准备好了,所以是乱序的
而
console
函数不会阻塞,所以按照顺序执行的