JS如何既是非阻塞/异步又是单线程的?

How is JS both non-blocking / asynchronous but single-threaded?

我无法想象 Javascript 如何在客户端既是单线程又是非阻塞的。我一直设想类似流水线的东西:

这就是我设想的非阻塞异步代码。第 1 行的主线程可以继续运行,而不必等待第 2 行先完成。但是这个流水线比喻需要两条流水线,或者说两个线程,而JS是单线程的。

所以现在我很困惑。

简而言之,运行时有一个事件循环,有点模拟 1 线程中的异步。 总而言之,我发现这个视频和文字是一个很好的解释: http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html

不,线程不是流水线。保持你的比喻:[=​​10=]

  • 一条装配线一系列事情,需要对你的汽车(或生产线生产的任何东西)进行操作
  • 一个线程就像一个工人在这些流水线上工作

是的,在单线程环境(单人工厂)中,工人一次只能在一条流水线上工作。但这并不意味着流水线不能运行并发。工人可以启动一台给汽车喷漆的机器,然后转到另一条生产线上安装一部分电机,然后回到已经喷漆的汽车上开始烘干......

这就是 JS 的工作原理。工人必须先完成当前步骤才能进行下一个任务,但随后他可以选择另一条他认为合适的装配线。这甚至允许 并行 处理,当他需要做的就是启动一台在后台做一些工作的机器时,因为他可以在等待信号时做其他事情机器完成了。