JS 事件循环

72 阅读2分钟

JS内核

js内核也叫JS引擎,主要负责解析和执行JS的代码,这是JS中的主线程,所以js是单线程异步,异步是由主线程调度子线程。 PS:JS线程程与GUI线程(后面会提到)

GUI线程

GUI线程是负责渲染浏览器界面 功能包括

  1. DOM tree 构成DOM树
  2. CSS rule tree 构成css规则树
  3. render tree 渲染树 是 DOM树和CSS规则树结合形成的
  4. layout 由于渲染等已经完成所以已经确定了节点,尺寸,大小
  5. paint 此时全部确定,调用显卡开始绘制
  6. reflow 回流 回流就是当浏览器发现样式发生改变时重新渲染的过程,一般我们无法预估reflow的位置
  7. repaint 重绘 像字体,边框色等这种不会改变其他布局样式的时候就会发生重绘,屏幕的一部分要重画,但是元素的几何尺寸没有变。

事件监听线程

当发生 onclick,onfocus等事件时会由主线程分配给事件监听线程处理

网络线程

当有fetch , ajax 等网络请求的时候 就会由主线程分配给网络线程

定时器线程

一些定时器,settimeout,setinterval

执行栈

浏览器的js执行栈 执行顺序为执行完就出去,入栈和出栈的过程。

事件循环**

上面的概念铺垫完后我们上实战,网上用很多图,这里就不粘贴了。

流程

1.js执行栈在解析script标签中的代表时,遇到同步代码直接执行,遇到异步代码则交给对应的线程。 2.对应的线程将异步的任务处理完后丢进对应的任务队列中 3.在执行栈为空的时候,他会优先去微任务队列中去执行,如果有微任务执行过程中产生了微任务他就会放在微任务的末尾,依次执行, 4.当微任务队列为空的时候,就回去宏队列 取一个任务去执行,执行完了以后会再去检查微任务是否有新的任务。