var arr = [1,2,3,4];
for(var i=0;i<arr.length;i++){
setTimeout(function(){
console.log(i)
})
}
这个代码为什么输出是4个4?求详解
setTimeout是个异步定时函数,js是单线程,所以就算延时为0,它也是要等到for循环执行完了,才到它执行,每执行一次for语句就会就会产生一个异步执行,放在等待队列里,所以最后执行时就是输出4个4了。
这样写。
var arr = [1,2,3,4];
for (var i = 0; i < arr.length; i++) {
setTimeout(function (i) {
console.log(i);
}(i));
}
这是标准的闭包问题。到最后执行console.log(i)的时候。这个i已经变成4了。所以输出4个4。
JS是單線程執行,意思是一次只能做一件事
setTimeout設定的是"1毫秒後執行"
但實際上是"如果當前沒有正在執行的工作,1毫秒後執行"
就你的案例,當前正在執行for迴圈
所以你的setTimeout裡的function要等到迴圈執行完才會被執行
迴圈竟然已經執行完,i當然是4囉
闭包引起的问题.