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

Is the event loop in Javascript executing in a separate thread?

本文关键字:事件 执行 循环 单独 Javascript 线程      更新时间:2023-09-26

我仍然相信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,每个浏览器都使用堆栈,所以你会在inspect元素中看到操作被放在堆栈中,所以根据你的脚本代码,首先它会完成5000次迭代的循环。

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

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

您可以从http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/

了解更多信息