setTimeout()函数回调属于异步任务,会出现在宏任务队列中,
被压到了任务队列的最后,在这段代码应该是for循环这个同步任务执行完成后才会轮到它,
所以for循环在遍历过程中i不断加1,直到i判断失败一次才停止,
这时候i为5,也就是说空跑了5次循环。
等到了setTimeOut预定的时间后就会执行在for遍历过程中声明的5个setTimeout。
所以最终运行后会出现上面的结果,与预期结果不符。
var arr = [1,2,3,4];
for (var i = 0; i < arr.length; i++) {
setTimeout(function() {
console.log(i);
console.log(arr[i]);
}, 2000);
}
var arr = [2, 4, 6, 8, 10];
var arrLength = arr.length;
for (let i = 0; i < arrLength; i++) {
setTimeout(function() {
console.log('i是' + i);
console.log('value是' + arr[i]);
}, 2000);
}