【问题标题】:Confused about javascript timeout [duplicate]对javascript超时感到困惑[重复]
【发布时间】:2013-06-14 08:31:28
【问题描述】:

我有这样的功能:

var a = function () {
    setTimeout(function () {
        alert(2);
    }, 0);
    alert(1);
}

a();

结果是先提示1,再提示2

但我认为,虽然alert(2)setTimeout中,但它会立即执行,因为延迟是0

为什么先执行alert(1)

【问题讨论】:

标签: javascript settimeout


【解决方案1】:

setTimeout 有一个默认延迟,它会导致它在alert(1) 执行后执行

【讨论】:

    【解决方案2】:

    如果您不想立即执行,只需删除 setTimeout,您首先会得到 alert(1),因为 setTimeout 有一个最小值,请参阅 here。因此,当您将其设置为 0 时,它会根据浏览器使用最小值。

    【讨论】:

      【解决方案3】:

      正如其他人还指出的,setTimeout() 的最小超时时间为 4 毫秒。

      更重要的是,即使它的实际超时时间为 0 毫秒,它也不会首先触发。那是因为 Javascript 是单线程的(不考虑网络工作者)。

      alert(2) 最后触发,因为 setTimeout() 中设置的任何内容都只会在当前 Javascript 执行完成后触发。换句话说:setTimeout() 动作被放置在执行堆栈的末尾。

      所以当前函数执行将首先完成(运行alert(1)),然后才执行alert(2)

      这也是setTimeout 只保证其中的代码指定时间后执行,而不是在确切时间执行的原因。

      请参阅 http://ejohn.org/blog/how-javascript-timers-work/ 了解详细信息。

      【讨论】:

      • 投反对票的人可以撤销他的投票吗?或者指定答案有什么问题?因为我很确定它是 100% 正确的。
      猜你喜欢
      • 2015-02-11
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2017-05-06
      • 2020-08-21
      • 2018-08-15
      相关资源
      最近更新 更多