今日,发现了一个 for循环与setTimeout搭配使用好玩的现象
现象一:
for (i = 0; i < 10; i++) {
setTimeout(console.log(i), 0);
}
结果:
现象二:
for (i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i)
}, 0);
}
结果:
现象三:
var a = function (i) {
setTimeout(function () {
console.log(i)
}, 0);
}
for (i = 0; i < 10; i++) {
a(i);
}
结果:
查资料得知:
setTimeout(func,time)是在time(毫秒单位)时间后执行func函数。浏览器引擎按顺序执行程序,遇到setTimeout会将func函数放到执行队列中,等到主程序执行完毕之后,才开始从执行队列(队列中可能有多个待执行的func函数)中按照time延时时间的先后顺序取出来func并执行。即使time=0,也会等主程序运行完之后,才会执行。
故而,此时再调用定时函数,i的值已经变为10,10次的定时函数都会共用i=10这个值。