2013-05-25 31 views
11

下图摘自Jon Resig编写的书籍Secrets of the JavaScript Ninja的第3章。这里作者正在解释浏览器事件循环。在浏览器中运行的JavaScript的单线程概念

enter image description here

书中有这样说:

需要注意的是,它将在事件 到队列中的浏览器机制是外部事件循环模式是很重要的。处理 确定何时发生事件并将它们推送到 事件队列不需要参与处理事件的线程的处理 。

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

+0

通过所谓的**即时回调**(如[本答案](http://stackoverflow.com/a/2734311/1711186)中所述)可能会引起上述问题(也许)更有趣。简而言之,这样的**立即回调**将是Javascript代码运行,而其他代码由阻塞语句(即'alert()')终止尚未[运行完成](https://developer.mozilla.org /en-US/docs/Web/JavaScript/Guide/EventLoop#.22Run-to-completion.22)。由此看来,第二个任务“事件排队”可以引入多线程问题(即确定性)。好问题! – humanityANDpeace

+0

可能的重复[是否javascript保证是单线程?](http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded) – Liam

回答

9

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的信息。

+0

@alexandernst因为你引用[是保证JavaScript是单线程?](http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded?rq=1)问题我想知道你是否想要重新考虑声明“AFAIK处理所有事情(即填写队列和运行,**逐行**,任何JS代码)”?流行语是**立即回调**,正如在[此问题的顶部回答](http://stackoverflow.com/a/2734311/1711186)中明智提及的。你怎么看? – humanityANDpeace

+0

@humanityANDpeace事实上,这是一个有趣的阅读。我真的不确定每个浏览器究竟会如何处理您正在运行一段非常长的代码并立即回调的情况。无论如何,我可以向你保证的一件事是:如果你接受这个概念,它会适得其反,保证。 JS并不是运行任何类型的多线程/多进程/多任务。 – alexandernst

+0

@alexandernst我做了一些进一步的检查。当我使用'alert()'来暂停某些执行时,使用firefox我可以重现**即时回调/事件**的这种“无用”行为。我仍然怀疑这是否只是Firefox的一个bug。你有没有发现阅读规范,知道什么“应该”是处理并发的方式? – humanityANDpeace