谁或哪个线程拥有Javascript事件循环?

时间:2016-02-17 03:17:39

标签: javascript loops events

我在这里阅读了很多关于Javascript事件循环的文章。它们主要讲述事件循环如何与Web API或JS运行时一起工作,例如:将事件从Web API移动到要处理的事件队列等等。但我没有看到它们中的任何一个解释事件循环的运行位置,这真的给我留下了很多关于事件循环的问题。例如,谁调用事件循环?线程运行事件循环是否与单线程并执行JS代码的JS运行时线程相同?谁是事件循环的所有者?当浏览器窗口打开时,事件循环是否永远在那里运行?我理解(不完全是:()事件循环在主运行时代码完成时启动但事件循环如何启动?有人可以帮助回答我的问题以帮助我理解事件循环吗?谢谢!

1 个答案:

答案 0 :(得分:3)

  

谁调用事件循环?谁是事件循环的所有者?

JavaScript Engine(例如Chrome中的V8)持有event loopevent loop得名,因为它通常是如何实现的,通常类似于:

while(queue.waitForMessage()){
  queue.processNextMessage();
}
如果当前没有消息,

queue.waitForMessage会同步等待消息到达。

  

线程运行事件循环是否与单线程并执行JS代码的JS运行时线程相同?

JavaScript是single-threaded,JavaScript运行时(JavaScript引擎)中只有一个线程,它包含event loop

  

当浏览器窗口打开时,事件循环是否永远在那里运行?   我理解事件循环在主运行时代码完成时启动,但事件循环是如何启动的?

是的,事件循环在JavaScript引擎中运行。以下是Philip Roberts提出的一个video,用于说明事件循环如何在JavaScript中运行。

此处还有一张图片显示了以下如何在JavaScript Engine中运行。

function init() {
  var link = document.getElementById("foo");

  link.addEventListener("click", function changeColor() {
    this.style.color = "burlywood";
  });
}

init();

http://blog.carbonfive.com/wp-content/uploads/2013/10/event-loop.png

来源:

http://altitudelabs.com/blog/what-is-the-javascript-event-loop/

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