【问题标题】:Why is there a execution time difference between setimeout(function(), 0 ) and function()?为什么 setimeout(function(), 0 ) 和 function() 之间存在执行时间差?
【发布时间】:2012-06-18 18:28:20
【问题描述】:

我有一个 javascript 动画代码 -

function animate(position)
{
    ....

    ....

    if(position++ < xyz){
        animate(position); // ****this is the line that I replace with in the next attempt.
    }


}

这需要大约 1 秒的时间来执行。但如果我把超时功能设置为 0 时间,大约需要 15 秒才能完成。

setTimeout(function(){
            animate(position);
        }, 0);

为什么会出现这种巨大的时差?在代码中,我试图在 HTML5 画布上绘制一些像素。为了让我的问题更清楚,我省略了这些代码。

【问题讨论】:

  • func() 将立即执行该函数,而setTimeout(func, 0) 将在当前执行完成后执行func。如果您正在做许多其他事情,这可能会延迟 func 的执行(尽管 15 秒似乎有点多)。
  • 在我的循环中,在 animate 语句之后没有任何内容。所以 settimeout(0) 也应该意味着立即执行。
  • 整个动画延迟15秒。循环重复大约 1000 次。所以每个循环有 15 毫秒的延迟。

标签: javascript animation settimeout


【解决方案1】:

原因在于 JavaScript 在内部处理计时器的方式。由于 JavaScript 是单线程的,因此不会同时运行任何东西。将 0 毫秒传递给 setTimeout 只会强制函数在第一个可用时刻运行。 John Resig 在http://ejohn.org/blog/how-javascript-timers-work/ 写了一篇很好的文章。

您可以通过运行以下命令来查看:

setTimeout(function() {
    console.log('one');
}, 0);
console.log('two');

twoone 之前记录。

我假设你有一堆其他的东西在运行,并且通过排队 animate 你让执行等到其他的东西完成。

【讨论】:

    【解决方案2】:

    https://developer.mozilla.org/en/DOM/window.setTimeout 有一些关于setTimeout 钳位的信息。请参阅“最小延迟”部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2023-03-25
      • 2018-03-13
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多