关于浏览器事件循环具体实现?

网上有不少讲解浏览器事件循环机制的文章,主线程、任务队列、微任务、宏任务.....都说的大同小异! 单有一点还是不明白:浏览器具体是怎么实现的?

首先!如果有事件发生(不管是网络还是鼠标事件...)这个事件需要先添加到任务队列等待处理,那么问题来了,他是怎么把事件添加到队列的?或者是说浏览器是怎么知道有事件发生了?
对于这点我的猜想是:也许所有异步的操作在有结果的时候都会调一个函数(不管是一个函数还是一个什么鬼,反正就是同一段代码),这段代码的作用就是通过各种计算最终把事件处理程序添加到任务队列去....

然后!浏览器是怎么执行循环机制的?我的猜想有两个:
1、也许是通过事件来触发循环检查队列的行为的,比如当有一个异步事件到来,浏览器除了会调用我上面说的那段代码放置事件处理程序之外,可能还会在放置后立马触发一次队列检查,如果有事件任务就立即取出执行,
2、这个就简单暴力了,也许浏览器另开一个线程,这个线程里埋了个定时器,就是setInterval一样,每隔1毫秒甚至0.5毫秒就去检查一下任务队列...! 但这样好像很浪费资源!

大佬们认为呢?

阅读 2.5k
5 个回答

单线程只是说主线程是单线程,不是说没有别的任何线程,所以以我的理解,event loop的意思大概就是开个事件循环线程执行while(true)

图形窗口程序一般都是通过循环来实现事件捕捉和处理的

和你认为的2差不多,实际上是另开了一个线程来做 event loop。

js抽象内是单线程(至少标准实现是单线程)

我的理解是浏览器处理完一个任务后就开始轮询看下一个要处理的任务(里面应该有一些策略),然后再进行下一个任务。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题