下图取自Jon Resig所着的书Secrets of the JavaScript Ninja的第3章。这里作者正在解释浏览器事件循环。
这本书必须这样说:
重要的是要注意放置事件的浏览器机制 队列在此事件循环模型的外部。处理 必须确定何时发生事件并将其推入 事件队列不参与正在处理的线程 事件
所以我的问题是,说浏览器中的JavaScript是单线程的吗?我问这个问题,因为显然有两个单独的任务(处理事件和事件排队在这里并行进行)。
答案 0 :(得分:11)
JavaScript在任何地方,浏览器或NodeJS中都是单线程的。它绝不应该以任何方式支持多线程(并且可能如果某人使用某种多线程实现JS引擎,肯定会发生坏事)
编辑回答你的编辑:
该事件队列充满了来自浏览器主循环的数据(鼠标/ kb事件,网络事件等)。那个运行JS的主循环。你发布的数字是正确的,但它(种类)模糊了现实。 AFAIK只有一个线程处理所有内容(即填充队列和运行,逐行,任何JS代码)。
编辑:证明这一点的一种方法:创建一个非常长的循环和一个文本区域。在循环运行时尝试在文本中写入。你不能:这是因为主循环忙于运行循环所以它无法处理kb事件。
编辑:这似乎是一个非常好的答案:Is JavaScript guaranteed to be single-threaded?
最后一次编辑后+ 2年:这个答案有点老了,脱离了现实。 io.js(以及之后的node.js,可能是Chrom [e | ium],FF,Safari之后)正在推动多进程支持(通过工作者)。您可以查看有关here的更多信息。
答案 1 :(得分:0)
@alexandernst
证明这一点的一种方法:创建一个非常长的循环和一个文本区域。尝试 在循环运行时写入文本。你不能:它是 因为主循环忙于运行循环所以它无法处理 kb events。
这种情况正在发生,因为事件循环无法处理事件。如果您等待循环完成,您将找到在循环运行时编写的所有文本。
这意味着你有一个单独的线程来获取输入事件并将它们放在队列中。