javascript使用setTimeout实现每隔一段时间输出1~9的数字

window.onload = function() {
      var i = 0;
      for(var j = 0;j < 10;j++) {
          setTimeout(console.log(i),10000*i);
          i++;
       }
};

以上代码期望在控制台输出1~9的数字,并且希望每隔一段时间输出一个数字,而不是在控制台一口气输出。但是以上代码是错误的,并不能保证每隔一段时间输出,而是同一时间输出。请问为什么?谢谢答复

12345678_0001
浏览 1233回答 16
16回答

茅侃侃

setTimeout的作用是将指定的代码段在指定的时间中加入执行队列。 简单的做法是使用setInterval。 你的代码等价于: window.onload = function() { var i = 0; for(var j = 0;j < 10;j++) { setTimeout(new Function(console.log(i)),10000*i); i++; } }; 所以就直接执行完了。 正确的写法是: window.onload = function() { var i = 0; for(var j = 0;j < 10;j++) { setTimeout(function(){console.log(i);i++;},10000*j); } };  

不负相思意

setInterval(function(){ print your text },3000);

大话西游666

首先谢谢你的回答~其实setInterval的实现我已经完成了,以下是完整代码。我只是对setTimeout的相同功能实现比较好奇。而且重点是我没有彻底弄明白,为什么我之前那样写setTimeout看不到延迟效果。 window.onload = function() { var i = 0; var bar = setInterval(test,1000); function test() { console.log(i); i++; if(i == 10) { clearInterval(bar); } } };

回首忆惘然

@Iwillknow: 要实现连接的定时,需要递归调用setTimeout

忽然笑

我试了一下。这个应该是for循环的原因,循环了就输出了。而setTimeout根本没起作用。

慕虎7371278

使用setTimeout本身是没有任何问题,通过时间间隔,同样可以实现。但,第一个参数需要注意,需要使用function代替,而不是直接把代码写在里面。setTimeout(function(){console.log(i)},10000*i);,大概浏览器需要解析吧。第二种方式,使用字符串代替函数体,setTimeout("console.log(1)",10000*i);。可以实现同样的效果。

呼唤远方

典型的闭包问题,你测试下i看看,i是同一数字。然后如果是闭包问题,就是google闭包吧

哈士奇WWW

确切地讲是闭包问题的延伸版。这里考虑已经不是单纯的闭包问题了,而是setTimeout

30秒到达战场

不好意思,我在chrome和FF下测试,输出结果都是1~9,完全不符预期。代码是这样子的(简化版) <!doctype html> <html> <head> <script> window.onload = function() { var i=0; var max=9; function incrementNum(){ i++; console.log(i); if(i<max){ setTimeout(incrementNum,1000*i); }else{ clearTimeout(incrementNum); } } incrementNum(); } </script> <head> <body> </body> <html> 能具体说下你那边的实际情况吗?^_^

胡说叔叔

@Iwillknow:  我是直接在firebug上面输出的,有你要求的时间间隔输出效果哈 第一次的时候,输出1,接着立马就是一个undefined。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript