Javascript 与 setTimeout(..., 0) 异步

Javascript Asynchronous with setTimeout(..., 0)

我想更好地了解事件循环和异步代码在 Javascript 中的工作原理。网上有大量资源,但我找不到问题的答案

每天我主要使用回调、promises、async/awaits,但最后我只是依赖已经异步的方法。

因此我想知道它是如何工作的,从头开始创建一个异步函数,并处理阻塞代码(或者我应该说慢代码,它不是 HttpRequest 或任何已经提供给我们的东西)。

例如,以非常高的条件停止它的 while 循环,应该需要一秒钟才能完成。这就是我决定为我的测试实施的。

经过我的研究,我可以读到一种使我的代码异步的方法,即使用具有 0 毫秒延迟的 setTimeout(在事件队列中放置一条消息,该消息将在下一个之后执行打勾)

function longOperation(cb) {
    setTimeout(function() {
        var i = 0;
        while (i != 1000000000) { i++; }
        cb();
    }, 0);
}

longOperation(() => {
    console.log('callback finished');
})

console.log('start');

我的问题是:

当我的代码终于要执行时,为什么它不再阻塞了?正常执行它和放置事件循环将选择将其推送到调用堆栈的消息有什么区别?

以下视频展示了事件循环如何处理 setTimeout 且延迟为 0。

JavaScript Event loop with setTimeout 0

但是,执行的代码是一个简单的控制台日志。在我的示例中,这是一个 "long" 操作...

  1. 外层代码执行完毕。
  2. setTimeout 0 计时器立即到期,因此它的回调 运行 立即执行并执行完成(long-运行ning while 循环及其回调)。

在这两个代码执行阶段,没有其他 JavaScript 用户代码会 运行。