setInterval会导致浏览器挂起吗?

zzz*_*Bov 3 javascript settimeout setinterval

几年前,我被警告不要使用setInterval很长一段时间,因为如果被叫函数的运行时间超过指定的时间间隔,它会导致浏览器挂起,然后就无法赶上:

setInterval( function(){
  foo = 'bar_' + i++;
}, 1 );
Run Code Online (Sandbox Code Playgroud)

现在,我知道,在一个循环中添加大量的代码可能会导致浏览器挂起无论如何,这阻止这样的代码alert,prompt以及confirm将停止它的轨道的代码,但是有没有什么好的理由,以避免setInterval

注意:我知道如何进行递归setTimeout调用(因为这是我一直在使用的),这个问题是我试图弄清楚它是否仍然值得使用它们,或者是否setInterval可以安全使用.

mVC*_*Chr 18

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

setInterval( complexFunction, 1 ); // complexFunction takes >1 MS to complete
Run Code Online (Sandbox Code Playgroud)

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

setTimeout( complexFunction, 1 );

function complexFunction() {
  // complex code
  setTimeout( complexFunction, 1 );
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这绝对是不正确的**.如果浏览器忙于整个时间间隔到期两次,则间隔调用将被丢弃**,而不是排队等待.[见例子.](http://jsfiddle.net/josh3736/CyVdz/) (3认同)
  • https://developer.mozilla.org/en-US/docs/DOM/window.setInterval#Dangerous_usage (2认同)
  • 我知道这是一个旧线程,但我会注意到我遇到了这个问题,非常与ajax请求进行间隔.我通过使用超时和嵌套调用来解决它,以便在最后一个解析时重置超时.这不是桌面上的问题,但我在平板电脑上遇到它(非常糟糕的平板电脑). (2认同)