for(;i<5;i++)
{
(function(z){
setTimeout(function(){console.log(z);},2000);})(i);
}
这会在 2 秒后一次打印 0 1 2 3 4 5。为什么会这样?以及在 2 秒后打印每个数字的解决方案是什么。
for(;i<5;i++)
{
(function(z){
setTimeout(function(){console.log(z);},2000);})(i);
}
这会在 2 秒后一次打印 0 1 2 3 4 5。为什么会这样?以及在 2 秒后打印每个数字的解决方案是什么。
尝试使用此代码。
//Referring your code for better understanding..
for(i=0;i<5;i++) {
(function(z){
setTimeout(function(){console.log(z);},2000*z);})(i);
}
setTimeout 不会在2 秒内阻止代码的执行。事实上setTimeout立即返回,循环继续。因此,您的所有 5 个异步调用在超时后几乎同时触发。
为了接近你想要的,我想要这个类似递归的版本
功能打印(一){
如果 (i >= 5) 返回;
控制台.log(i);
设置超时(函数(){
打印(我+1);
}, 2000);
}
打印(0);
您正在触发该函数的 5 个异步、几乎同时的调用。
setTimeout(fn,delay)fn延迟delay毫秒后运行给定函数。所以你可以简单地乘以i2000 并使用:
for(;i<5;i++) {
setTimeout(function(){console.log(z);},2000*i);
}
如果要报告或i使用in ,fn则应创建一个函数,该函数返回一个用于 in 的函数setTimeout,使用闭包来报告或使用i。下面i使用变量 括起来x,由立即调用的匿名函数使用,创建f函数 Object 以供后续使用setTimeout:
for(var i=0;i<5;i++)
{
var f = function(x){
return function(){console.log(z+'#'+x);}
}(i);
setTimeout(f,2000*i);
}
您可以尝试使用 diff 方法setInterval,
var timer = setInterval(function(){printThing();},2000);
var i = 0;
function printThing(){
if(i<=5){
window.console && console.log(i);
++i;
}
else{
clearInterval(timer)
}
}//end function