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