这是因为Javascript是单线程的吗?
我遇到了这样一个片段这是因为Javascript是单线程的吗?,javascript,Javascript,我遇到了这样一个片段 (function(){ for(var i=0;i<3;i++){ setTimeout(function(){ console.log(i) }) } }()) (函数(){ for(var i=0;i这是因为JavaScript以async的方式执行。当console.log(i)执行时,for循环完成了它的迭代,并且由于JavaScript没有块级范围,console.log(i)中的i的值在所有迭代中都变成了3 解决方法是
(function(){
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(i)
})
}
}())
(函数(){
for(var i=0;i这是因为JavaScript以async
的方式执行。当console.log(i)
执行时,for循环
完成了它的迭代,并且由于JavaScript没有块级范围,console.log(i)
中的i
的值在所有迭代中都变成了3
解决方法是使用IIFE并将i
传递到范围:
for(变量i=0;i<3;i++){
(职能(一){
setTimeout(函数(){
控制台日志(i)
});
})(i) );
}
这是因为对setTimeout()函数的调用将初始化计时器。因此,一旦设置了计时器,调用后的其余语句将被执行。当前执行堆栈完成后,将调用计时器
你可以从中清楚地了解它是如何发生的是的,确实如此。你是在问如何避免这种情况,还是只是想确认观察到的行为?你的超时函数在循环完成后执行。那时你的i
等于3,也就是y,它总是记录为3。偶数(尤其是)如果JS是多线程的-这个解决方案不能保证一行返回1,2,3
。