【问题标题】:Why setTimeout(fn, 0) and setTimeout(fn, 1) are same while sT(fn, 5) / sT(fn, 6) are not? [duplicate]为什么 setTimeout(fn, 0) 和 setTimeout(fn, 1) 相同,而 sT(fn, 5) / sT(fn, 6) 不同? [复制]
【发布时间】:2020-08-22 22:14:58
【问题描述】:

自从 2011、2012 年以来,已经有一段时间没有提出此类话题了。 现在,这段代码


  setTimeout(()=>{ console.log(1); }, 1);
  setTimeout(()=>{ console.log(2); }, 0);
  setTimeout(()=>{ console.log(3); }, 2);

将打印 1-2-3,即使您预计 2 的记录速度比 1 快。

您可以通过指出“所有小于 4 毫秒的超时将延迟到 4 毫秒”来解释。

或者说大约 13 毫秒的滴答声,比如 - 到第二行执行时,第一行已经清除了时间并被记录,但是不,如果我们使用 2-3 毫秒时间,这两个规则都不会适用。在这种情况下,一切都按预期工作

证明:

  setTimeout(()=>{ console.log(1); }, 3);
  setTimeout(()=>{ console.log(2); }, 2);
  setTimeout(()=>{ console.log(3); }, 2);

不会应用该规则 - 2 在 1 之前记录,按照 ms 顺序指示。

这种行为在 Chrome 84 中遇到。 Firefox 正在按顺序执行所有这些代码,无论那里有什么毫秒。 1-2 或 3-2 或 6-5 等 原来 Chrome 的 1ms 和 0ms 是相同的,而 5-6 或 2-3 是不同的 PS:Opera 的行为也像 Chrome。 1ms 与 0 相同,2ms 与 1ms 不同

为什么?

【问题讨论】:

  • 无法保证何时执行 setTimeout EXCEPT 它不会运行 before n(第二个参数)毫秒设置好了。
  • 因为他们有不同的 JavaScript 引擎,而你的延迟太短,不相关
  • @MisterJojo 为什么对于 Firefox 我的短暂延迟是相关的?
  • 不,它们不是,即使对于 Firefox 也是如此
  • 其实我有个主意。首先,当然浏览器引擎是不同的,Firefox 以其他方式处理此代码,从而产生预期的结果。至于“为什么 1 被视为 0 而 2 与 1 不同”,我建议如下。可能是 1ms 不足以让浏览器解析和执行所有代码,并且 1ms 时间被清除并在解析第二行之前运行,导致 console.log(1) 在 console.log(2) 之后执行,而所有其余示例 ( 2ms 或更多)足以以正确的顺序解析/执行所有代码。

标签: javascript google-chrome firefox settimeout


【解决方案1】:

因为在调用排队的代码块时已经过了 1 毫秒。看到第一个在队列的最前面,过了超时时间就会被执行。

【讨论】:

  • 不,这是错误的解释。
猜你喜欢
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2021-08-13
  • 2010-11-29
  • 2013-01-07
  • 2021-08-19
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多