先谈浏览器,浏览器是个多进程,每当打开一个新网页就会产生一个进程,每一个进程里面存在多个线程,
GUI渲染线程
负责浏览器界面解析HTML,css,将标签构建成Dom树,然后结合css形成render树,然后开始把一些宽高位置进行布局,开始重排,与重绘,重绘是指元素的外观改变,重排是指dom节点的变化。
重绘不一定重排(改变颜色),重排一定重绘,
获取元素的周围或者浏览器,或者相对位置偏移量,卷曲等等都会重排获取。还有table布局,微小的改动都会频繁的让浏览器重排
js引擎线程
负责处理js的脚本程序(v8引擎)
解析js脚本运行代码
js引擎有同步主线程任务场所,有异步的任务场所
主线程同步执行完毕就会去异步获取对应的结果(异步的时候分宏任务与微任务)异步任务队列,当主线程空闲的时候先触发的先执行,当主线程不空闲的时候后完成的先执行,promise里面的then与catch是异步任务队列。
[宏任务:macro task]
- 定时器
- 事件绑定
- ajax
- 回调函数
- Nodejs中fs可以进行异步的I/O操作
  [微任务:micro task]
- Promise(async/await) => Promise并不是完全的同步,当在Excutor中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会再去调用resolve/reject把存放的方法执行
- process.nextTick (node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找)
- vue里面的nextTick但凡dom变化都会放在下一个栈里面不在当前刷新
   - MutationObserver (创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。)
   同步> 微任务 >宏任务 执行顺序
定时触发线程
setinterval与settimeout 添加事件队列 等待主线程也就是js引擎空闲执行
低于4ms算4ms 存在最低的要求有差异会变化影响不大
事件触发线程
归属于浏览器,用来控制事件循环,浏览器另开其他线程

异步http请求
xmlhttprequest是新建一个线程请求
HTML5 里面引入web worker Worker可以理解是浏览器给JS引擎开的外挂,专门用来解决那些大量计算问题