【发布时间】: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