Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是因为Javascript是单线程的吗?_Javascript - Fatal编程技术网

这是因为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