JS内核
js内核也叫JS引擎,主要负责解析和执行JS的代码,这是JS中的主线程,所以js是单线程异步,异步是由主线程调度子线程。 PS:JS线程程与GUI线程(后面会提到)
GUI线程
GUI线程是负责渲染浏览器界面 功能包括
- DOM tree 构成DOM树
- CSS rule tree 构成css规则树
- render tree 渲染树 是 DOM树和CSS规则树结合形成的
- layout 由于渲染等已经完成所以已经确定了节点,尺寸,大小
- paint 此时全部确定,调用显卡开始绘制
- reflow 回流 回流就是当浏览器发现样式发生改变时重新渲染的过程,一般我们无法预估reflow的位置
- repaint 重绘 像字体,边框色等这种不会改变其他布局样式的时候就会发生重绘,屏幕的一部分要重画,但是元素的几何尺寸没有变。
事件监听线程
当发生 onclick,onfocus等事件时会由主线程分配给事件监听线程处理
网络线程
当有fetch , ajax 等网络请求的时候 就会由主线程分配给网络线程
定时器线程
一些定时器,settimeout,setinterval
执行栈
浏览器的js执行栈 执行顺序为执行完就出去,入栈和出栈的过程。
事件循环**
上面的概念铺垫完后我们上实战,网上用很多图,这里就不粘贴了。
流程
1.js执行栈在解析script标签中的代表时,遇到同步代码直接执行,遇到异步代码则交给对应的线程。 2.对应的线程将异步的任务处理完后丢进对应的任务队列中 3.在执行栈为空的时候,他会优先去微任务队列中去执行,如果有微任务执行过程中产生了微任务他就会放在微任务的末尾,依次执行, 4.当微任务队列为空的时候,就回去宏队列 取一个任务去执行,执行完了以后会再去检查微任务是否有新的任务。