Javascript计时如何真正起作用?

时间:2010-09-06 04:52:51

标签: javascript

说我有一些代码:

setInterval(foo,1000); // here is an interval that causes a function to repeat
function foo(){
//a number of lines of code
}

现在,我认为这会导致系统时钟每秒执行foo(),而这:

function foo(){
//a number of lines of code
setTimeout(foo,1000);    } //here is a timeout that causes the function to repeat

我是否正确地猜测后一个函数在给定的时间段内执行的频率会降低,因为我在执行之间插入一个暂停(它们本身会占用可衡量的数量)时间)?对这一机制的任何进一步观点或启示都会受到欢迎。

3 个答案:

答案 0 :(得分:2)

让我引用约翰Resig关于计时器的article,它专门针对您的问题:

setTimeout(function(){
  /* Some long block of code... */
  setTimeout(arguments.callee, 10);
}, 10);

setInterval(function(){
  /* Some long block of code... */
}, 10);
  

这两段代码可能会出现   起初功能相同   一瞥,但他们不是。值得注意的是   setTimeout代码将始终为   在前一次之后至少延迟10ms   回调执行(可能会结束   更多,但永远不会更少)而   setInterval将尝试   每10ms执行一次回调   无论何时最后一次回调   被执行了。

     

如果间隔时间足够长(超过指定的延迟),则间隔可以无延迟地执行。

请记住,accuracy of JavaScript timers在浏览器和平台之间存在差异。

答案 1 :(得分:0)

  

现在,我认为这会导致foo()每秒被系统时钟执行

没有硬性保证。间隔时间至少为一秒,但可能更多取决于CPU负载以及OS定时器的分辨率。

  

我是否正确地猜测后一个函数在给定的时间段内执行的频率会降低,因为我在执行之间插入暂停

它会相同或更少,具体取决于foo()是否需要花费大量时间来执行。

答案 2 :(得分:-1)

“function foo(){

//多行代码

的setTimeout(FOO,1000);

}“

在你的代码中,你的foo()没有结束,实际上它创建了无限循环。最好删除你的“setTimeout()”函数,然后你可以尝试将它放在foo()内的其他地方。