JavaScript setInterval和setTimeout

时间:2012-10-24 11:53:57

标签: javascript settimeout setinterval

下一个代码每隔1秒显示一次,然后停止。

(function() {
    var i = setInterval(function() {
        console.log(new Date());
    }, 1000);
    console.log("Hi");

    setTimeout(function() {
        clearInterval(i);
    }, 3000);
    console.log("Hola");
})();

输出:

Hi
Hola
Wed Oct 24 2012 13:35:27 GMT+0200 (CEST)
Wed Oct 24 2012 13:35:28 GMT+0200 (CEST)
Wed Oct 24 2012 13:35:29 GMT+0200 (CEST)

但我不知道为什么首先显示HiHola。另外,为什么setTimeout被执行?不应该每1秒执行一次setInterval而不能执行任何其他操作? (上面的代码是按照编写顺序运行的吗?) 感谢。

4 个答案:

答案 0 :(得分:4)

评论显示执行顺序

(function() {                           // 0 anonymous function is called inline

    var i = setInterval(function() {    // 1 setInterval **schedules** the function 
                                        //     parameter to be executed every second
        console.log(new Date()); 
    }, 1000);
    console.log("Hi");                  // 2 Display 'Hi' on console

    setTimeout(function() {             // 3 **Schedule** the function parameter to 
                                        //     execute after three seconds
        clearInterval(i);     
    }, 3000);
    console.log("Hola");                // 4 Display 'Hola' on console
})();

                                        // 5 Display date from setInterval function

                                        // 6 Display date from setInterval function

                                        // 7 Display date from setInterval function

                                        // 8 Cancel setInterval executed from 
                                        //     setTimeout function

希望这可以解决你的困惑。

答案 1 :(得分:3)

setTimeout以及setInterval仅注册函数(回调),但直接转到下一个命令。

因此,在调用第一个回调之前会打印HiHola

第一次回调将是{1}在1秒后的回复,然后在2秒之后再回复.3秒后setInterval开始并清除setTimeout

答案 2 :(得分:2)

无论如何,setTimeout()setInterval()都会被执行。 它不是sleep() PHP的方法......很遗憾!

但是,此链接可能很有用:http://www.phpied.com/sleep-in-javascript/

答案 3 :(得分:2)

http://ejohn.org/blog/how-javascript-timers-work/

这两个事件是异步的。它们在下一个可用时刻排队/执行,而不是在调用“setTimeout”或“setInterval”的确切时间。