在javascript中使用setInterval()时控制程序流程

时间:2012-09-15 16:24:49

标签: javascript setinterval



我真的不明白在Javascript中使用setInterval()时程序的控制流程 如果我们提供一个需要100ms时间的函数作为SetInterval()方法的参数执行,时间为20ms,如下所示

       setInterval(function{
                      for(var i=0;i<1000000;i++)
                           console.log(i)
                           },20);

setInterval()在20ms后再次调用它时,会发生什么? thanx :)

添加 : 简单循环和使用setInterval进行循环和使用clearInterval进行停止之间的主要区别是什么? 检查此http://www.sitepoint.com/multi-threading-javascript/

3 个答案:

答案 0 :(得分:1)

首先让我们从修复你的javascript开始,因为你有一些错过的右括号:

setInterval(function() {
    for(var i = 0; i < 1000000; i++) {
        console.log(i);
    }
}, 20);

这相当于以下内容:

function loopAndDump() {
   for(var i = 0; i < 1000000; i++) {
       console.log(i);
    }
}

setInterval(loopAndDump, 20);

或:

setInterval(function() { loopAndDump(); }, 20);

现在更容易理解会发生什么:loopAndDump函数每隔20ms定期调用一次。此函数只是从0循环到1000000并将计数器转储到控制台。如果你想停止这个过程定期执行函数你可以使用stopInterval函数并将它作为参数传递给setInterval函数返回的结果。

如果您只想执行一次该功能,那么您可以使用setTimeout方法:

setTimeout(function() {
    for(var i = 0; i < 1000000; i++) {
        console.log(i);
    }
}, 20);

现在循环只执行一次,在javascript解释器到达setTimeout行后20ms。

答案 1 :(得分:0)

20 ms后不会再次调用。

Javascript严格是单线程的,因此只要您的函数正在运行,就不会处理任何事件。间隔计时器将在20 ms后触发事件,但在功能完成之前不会处理。

答案 2 :(得分:0)

setInterval是一个Javascript计时器。永远记住:在Javascript中,不保证定时器延迟。由于浏览器中的所有JavaScript都在单个线程上执行,因此异步事件仅在执行中打开时运行。

var some_function = function() { 
    for (var i=0; i < 1000000; i++) { 
        console.log(i); 
    } 
};
setInterval(some_function, 20);

执行此示例时,JavaScript启动计时器,并在20ms内执行some_function

假设some_function完成需要100毫秒,那么当函数完成执行后100分钟将发生的事情是JavaScript将环顾四周以查看等待执行的内容。

setInterval执行开始后约20ms,会收到另一个执行some_function的请求(由setInterval设置的计时器)。在收到命令时,由于JavaScript正忙于运行some_function,因此无法执行。

由于没有任何阻止setInterval操作再次发生,JavaScript将重新执行它。自setInterval计时器启动以来已经过了大约120毫秒,你的some_function显然会背靠背地执行。