javascript - JavaScript在浏览器中运行的单线程概念

标签 javascript asynchronous dom-events event-loop

下图摘自本书第3章Secrets of the JavaScript Ninja乔恩·雷西格 (Jon Resig) 着。这里作者在讲解浏览器事件循环。

enter image description here

这本书必须这样说:

It’s important to note that the browser mechanism that puts the events onto the queue is external to this event loop model. The processing necessary to determine when events have occurred and to push them onto the event queue doesn’t participate in the thread that’s handling the events.

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

最佳答案

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)正在插入多进程支持(通过 worker)。您可以查看更多信息 here .

关于javascript - JavaScript在浏览器中运行的单线程概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16749664/

相关文章:

javascript - 如何更新 Mongoose 数据库中的数组元素

javascript - 如何制作加载更多按钮

javascript - 如何为 AngularJS 表单编写通用错误处理程序

javascript - 如何使用 q.js Promise 处理多个异步操作

javascript - 为什么我不能从 Koa 路由器提供静态文件?

javascript - async/await 链何时停止?

.net - 托管.NET和WinForms,SynchronizationContexts在.NET窗口的ShowDialog返回时重置

javascript - 将 JavaScript 处理程序应用于某个 HTML 标记的所有出现位置

reactjs - 如何通过输入 ReactJS 中的单词进行检测

javascript - JS点击事件监听器没有按预期触发功能