javascript中使用setTimeout的回调
为什么代码将console.log(i)的结果输出为10。为什么它不打印1,2..10javascript中使用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有
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