【发布时间】:2015-10-13 16:58:07
【问题描述】:
我正在仔细阅读一组在线 javascript 面试问题,并注意到以下问题:
function printing() {
console.log(1);
setTimeout(function() { console.log(2); }, 1);
setTimeout(function() { console.log(3); }, 2);
setTimeout(function() { console.log(4); }, 0);
console.log(5);
}
printing();
我希望以下代码将以下内容打印到控制台:1,5,4,3,2 我的原因是 console.log(1) 和 console.log(2) 先执行,而 setTimeout 被发送到 eventloop 等待一切先完成。打印 5 后,JS 将查看队列,然后 4、3、2 将推送/弹出。
但是,在我的 Chrome 浏览器上,我注意到 1,5,2,4,3 出现了。
我很困惑,但同时有一种预感,这可能是由于超时延迟的小幅增量导致了打嗝(可能是浏览器问题?)。我这样做的原因是因为我在每个数字后面添加了两个零,这样延迟变为 100、200 和 0。
谁能澄清幕后发生的事情,以及我应该知道的有关延迟的任何陷阱?
【问题讨论】:
-
非常确定超时的最小有效值为 1,因此 0 被移到 1,因此发生在之后。没有把握。无论如何,我不使用小于 16 毫秒 (60Hz) 的计时器,因为这是 Windows 上的默认计时器分辨率,我不想仅仅为了它而使用高分辨率计时器。
-
我注意到以下链接,其中最小值为 4 毫秒和 10 毫秒,具体取决于浏览器:stackoverflow.com/questions/9647215/…
-
可能值得注意的是,在w3 spec 的第 6.4 节中,它声明了
... timeout is less than 4, then increase timeout to 4(如果根据规范,您的 ms 值是 0-3,它将被设置为 4),然后,您可能会发现以下关于 Javascript 计时有用 How Javascript Timers work
标签: javascript