繁体   English   中英

Javascript 中的事件循环是否在单独的线程中执行?

[英]Is the event loop in Javascript executing in a separate thread?

我仍然相信 Javascript 是单线程的,但是当我想到事件处理机制时,我有些怀疑。

  • 事件循环是一个单独的线程,它从队列和进程中一个一个地拉取事件。

为什么我认为即使在处理队列中的一个事件时,它也可以侦听或将事件推送到同一队列。 我创建了一个示例,如下所示:

 <html> <head> <script> function clicked(){ alert("clicked in between.."); } function longRun(){ for(var i=0;i<50000;i++){ console.log(i); } alert("completed .... "); } </script> </head> <body> <input type="button" value="quick!" onclick="clicked();"/> <input type="button" value="long run!" onclick="longRun();"/> </body> </html>

当我点击长期运行! 这需要一些时间才能完成,但与此同时,如果我点击快速! 它将被添加到事件队列中,并在长期运行事件后立即执行。

实际发生了什么? 谁能解释/纠正我

除了 webWorkers(我们不在此讨论),浏览器中的每个窗口只有一个“用户线程”。 这意味着只有一个线程在运行您的用户 Javascript。

这并不意味着幕后浏览器引擎没有其他一些线程来处理非 Javascript 处理。 事实上,这种情况的可能性很大。 但是,由于这些其他可能的线程从未实际运行任何 Javascript 或影响任何 Javascript 变量,因此它们不会直接影响 JS 执行环境。

是的,这些其他线程确实可能将内容插入到 JS 事件队列中,稍后当主 JS 线程准备好处理下一个事件时,这些内容将被拾取。

请参阅此答案JavaScript 如何在后台处理 AJAX 响应? 了解更多信息和相关文章列表。

每个标签只有一个线程。 该线程执行 JavaScript 和屏幕更新。 longRun正在执行时,您无法对按钮的点击做出反应; 您注册的事件将在所有 50000 次迭代完成后触发。

澄清一下:事件被放入队列中。 队列由选项卡线程按顺序执行。

编辑:而且,确实有工作人员,但他们表现得好像在不同的选项卡中执行 - 他们有自己的上下文,并且只能使用postMessage与调用程序进行通信。

如果您使用 safari,每个浏览器都使用堆栈,因此您将在检查元素中看到操作被放入堆栈中,因此根据您的脚本代码,它首先完成 5000 次迭代的循环。

Javascript 在单线程上工作。事件按fifo顺序排队和处理。

我们正在做的是编写事件处理程序,它只是回调函数,一旦从队列处理事件,它就会执行,因此它是单线程但本质上是异步的。

您可以从http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/了解更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM