为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

12345678_0001 2018-12-06 12:18:56
window.onload = function() { var i = 0; for(var j = 0;j < 10;j++) { setTimeout(console.log(i),10000*i); i++; } }; 以上代码期望在控制台输出1~9的数字,并且希望每隔一段时间输出一个数字,而不是在控制台一口气输出。但是以上代码是错误的,并不能保证每隔一段时间输出,而是同一时间输出。请问为什么?谢谢答复
查看完整描述

16 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

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);
       }
};

 

查看完整回答
反对 回复 2018-12-24
?
不负相思意

TA贡献1777条经验 获得超10个赞

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

查看完整回答
反对 回复 2018-12-24
?
大话西游666

TA贡献1817条经验 获得超14个赞

首先谢谢你的回答~其实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);
                    }
                }
            };
查看完整回答
反对 回复 2018-12-24
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

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

查看完整回答
反对 回复 2018-12-24
?
忽然笑

TA贡献1806条经验 获得超5个赞

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

查看完整回答
反对 回复 2018-12-24
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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

查看完整回答
反对 回复 2018-12-24
?
呼唤远方

TA贡献1856条经验 获得超11个赞

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

查看完整回答
反对 回复 2018-12-24
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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

查看完整回答
反对 回复 2018-12-24
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

不好意思,我在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>

能具体说下你那边的实际情况吗?^_^

查看完整回答
反对 回复 2018-12-24
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

@Iwillknow: 

我是直接在firebug上面输出的,有你要求的时间间隔输出效果哈

第一次的时候,输出1,接着立马就是一个undefined。

查看完整回答
反对 回复 2018-12-24
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

@Canrz: 不好意思,没有找到原因。根据检测只是知道,这个undefined是firebug抛出的一个警告,并不是其它原因(如setTimeout)造成的,因为即使运行如下代码也是会有undefined输出,再过分一点只有“var a = 0;”的字样也是会有undefined的输出。~应该是firebug的原因,学术浅薄具体不详>_<,抱歉。

function test() {
    console.log("1");
}
test();
查看完整回答
反对 回复 2018-12-24
?
长风秋雁

TA贡献1757条经验 获得超7个赞

@Iwillknow:额 ,如果去掉test(),单独跑

function test() {
    console.log("1");
}

就会输出一个undefined。

你前面说的“在chrome和FF下测试,输出结果都是1~9,完全不符预期”是什么情况,我firebug和浏览器单开都是隔段时间输出一个数字

查看完整回答
反对 回复 2018-12-24
?
LEATH

TA贡献1936条经验 获得超6个赞

@Canrz: 不好意思,是完全符合预期,是能间隔一段时间输出一个数字的。~是undefined的输出不符合

查看完整回答
反对 回复 2018-12-24
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

@Iwillknow:哦,了解了,明天再查查问问,看有没有大神解惑 

查看完整回答
反对 回复 2018-12-24
  • 16 回答
  • 0 关注
  • 1232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号