javascript中使用setTimeout的回调

javascript中使用setTimeout的回调,javascript,Javascript,为什么代码将console.log(i)的结果输出为10。为什么它不打印1,2..10 for(i=0;i<10;i++){ function abc(callback){ console.log(i); setTimeout(callback,5000); } } abc(function (){console.log(i)}) for(i=0;i可以查看提升和函数范围。您的代码主要如下所示(在解析器视图中) for(i=0;i这是因为i有

为什么代码将console.log(i)的结果输出为10。为什么它不打印1,2..10

for(i=0;i<10;i++){

    function abc(callback){

    console.log(i); 
    setTimeout(callback,5000);  
    }

}

abc(function (){console.log(i)})

for(i=0;i可以查看提升和函数范围。您的代码主要如下所示(在解析器视图中)


for(i=0;i这是因为
i
有一个全局作用域,在for循环之后,当您调用函数时,
i
的值是10。

您覆盖abc 10次。只需saying@Jonasw为了实现OP认为这段代码应该做的事情,应该有一个闭包:-)太长了,读不下去了。我把它包含在答案中,但是仍然是错误的重复,因为它在循环中创建函数声明,但是直到循环之后才调用函数。TL;DR是:在程序中只有一个变量<代码> i>代码。变量只能有一个值A。没时间了。
for(i=0;i<10;i++){}
//i=1
//i=2
//i=3
//...
//i=10
function abc(callback){ 
setTimeout(callback,5000); 
} 

abc(function (){console.log(i)})//i is 10 :0
    function abc(callback){ 
      for(var i=0;i<10;i++){
        (function(i){//see 'closures in for loops' on SO
          setTimeout(callback,5000); 
        })(i);
      } 
   }

  abc(()=>{alert(i)});//hehe