for(;i<5;i++)
{
(function(z){
setTimeout(function(){console.log(z);},2000);})(i);
}
这会在2秒后一次打印0 1 2 3 4 5.为什么会这样?什么是解决方案 在2秒后打印每个数字。
答案 0 :(得分:1)
你的超时需要间隔,我总是使用不同的var来保存每个,所以我可以在特定的一个上清除时间
var tIds=[];
for(var i=0;i<5;i++) {
(function(z){
tIds[i]=setTimeout(function(){window.console&&console.log(z);},2000*i); //fire 2000,4000,6000
})(i);
}
另请read the documentation了解为什么2000 +我似乎无法工作
答案 1 :(得分:1)
尝试使用此代码。
//Referring your code for better understanding..
for(i=0;i<5;i++) {
(function(z){
setTimeout(function(){console.log(z);},2000*z);})(i);
}
答案 2 :(得分:1)
您正在触发5个异步,几乎同时调用该函数。
答案 3 :(得分:1)
setTimeout
不会阻止代码执行 2秒钟。实际上setTimeout
立即返回,循环继续。因此,在超时后几乎同时触发了所有5个异步调用。
要接近你想要的东西,我会喜欢这种类似递归的版本
function print(i) { if (i >= 5) return; console.log(i); setTimeout(function () { print(i + 1); }, 2000); } print(0);
答案 4 :(得分:0)
您可以使用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
答案 5 :(得分:0)
setTimeout(fn,delay)
在ms后延迟fn
后运行给定函数delay
。因此,您可以简单地将i
乘以2000并使用:
for(;i<5;i++) {
setTimeout(function(){console.log(z);},2000*i);
}
如果要在i
中报告或使用fn
,则应创建一个函数,该函数返回一个函数以供setTimeout
使用,使用闭包来报告或使用{{1} }}。在下面的i
中使用变量i
包含,由立即调用的匿名函数使用,创建x
函数对象以供f
中的后续使用:
setTimeout