setInterval会导致浏览器挂起吗?

时间:2011-03-29 22:38:25

标签: javascript settimeout setinterval

几年前,我被警告不要长时间使用setInterval,因为如果调用的函数运行时间长于指定的时间间隔,它会导致浏览器挂起,然后就无法捕获起来:

setInterval( function(){
  foo = 'bar_' + i++;
}, 1 );

现在,我知道在循环中添加大量代码可能会导致浏览器无论如何都挂起 ,并阻止代码alertpromptconfirm会停止代码跟踪,但有没有充分理由避免setInterval

注意:我知道如何进行递归setTimeout调用(就像我一直在使用的那样),这个问题是我试图弄清楚它是否值得使用它们,或者{{1可以安全使用。

2 个答案:

答案 0 :(得分:17)

setInterval错误的原因是因为无论线程中发生了什么,它都会尝试每X MS执行一次代码。所以如果你有:

setInterval( complexFunction, 1 ); // complexFunction takes >1 MS to complete

...即使自己的代码完成,你最终可能会setInterval试图重新执行几次!但是,您可以类似地使用setTimeout并避免此问题:

setTimeout( complexFunction, 1 );

function complexFunction() {
  // complex code
  setTimeout( complexFunction, 1 );
}

...现在complexFunction只有在自己的代码完成后才会再次调用自己,所以如果自己的代码需要超过1 MS才能完成,那么就不会有任何积压来处理setInterval

答案 1 :(得分:-1)

最好在循环中使用setTimeout,以便准确知道何时继续计时:

foo();
function foo(){

   setTimeout (function(){
      foo = 'bar_' + i++;
      foo();
     }, 1 );

} 

否则如上所述,浏览器必须catch up,因为你的循环是无限的,它可能不是。