13

下图摘自Jon Resig的《JavaScript Ninja 的秘密》一书的第 3 章。在这里作者正在解释浏览器事件循环。

在此处输入图像描述

这本书不得不说:

需要注意的是,将事件放入队列的浏览器机制在此事件循环模型之外。确定事件何时发生并将它们推送到事件队列所需的处理不参与处理事件的线程。

所以我的问题是说浏览器中的 JavaScript 是单线程的是否正确?我问这个问题是因为显然两个独立的任务(处理事件和事件队列在这里并行进行)。

4

2 回答 2

11

JavaScript 在任何地方都是单线程的,在浏览器或 NodeJS 中。它从来不应该以任何方式支持多线程(如果有人用某种多线程实现 JS 引擎,肯定会发生坏事)

编辑回答您的编辑:

该事件队列充满了来自浏览器主循环的数据(鼠标/kb 事件、网络事件等)。运行 JS 的同一个主循环。您发布的数字是正确的,但它(有点)模糊了现实。AFAIK 只有一个线程处理所有事情(即填充队列并逐行运行任何 JS 代码)。

编辑:证明这一点的一种方法:创建一个非常长的循环和一个文本区域。尝试在循环运行时写入文本。你不能:这是因为主循环正忙于运行循环,所以它无法处理 kb 事件。

编辑:这似乎是一个非常好的答案:JavaScript 是否保证是单线程的?

上一次编辑后 +2 年:这个答案有点老了,脱离了现实。io.js(以及之后的 node.js,可能是 Chrom[e|ium]、FF、Safari)正在推动多进程支持(通过工作人员)。您可以在此处查看更多信息。

于 2013-05-25T12:43:23.587 回答
0

@alexandernst

证明这一点的一种方法:创建一个非常长的循环和一个文本区域。尝试在循环运行时写入文本。你不能:这是因为主循环正忙于运行循环,所以它无法处理 kb 事件。

发生这种情况是因为事件循环无法处理事件。如果你等待循环完成,你会发现你在循环运行时写的所有文本都会出现。

这意味着您有一个单独的线程来获取输入事件并将它们放入队列中。

于 2018-04-02T11:55:09.260 回答