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
毫秒后运行给定函数。所以你可以简单地乘以i
2000 并使用:
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