JavaScript事件循环机制浅解

95 阅读2分钟

JavaScript

JavaScript是浏览器的脚本语言。它是单线程的,其主要作用是与客户端进行交互。如果成多线程,假设一个线程在操作某一个dom节点,一个线程又在删除这个dom节点。此时浏览器就无法判断以哪个线程为主在,这种复杂场景大大增加了语言难度。

任务阵列与事件循环

由于JavaScript是单线程,所以所有的任务只能一个个等着被执行。任务阵列是一个先进先出的结构,排在前面的事件,优先进入主线程被执行
所有任务可以分为同步任务、异步任务
同步任务:立即执行的任务,同步任务一般会直接进入主线程中执行
异步任务:通过任务队列机制进行协调

698814-20180906144953689-838865376.jpg 同步任务和异步任务会分别进入不同的执行环境。同步任务进入主执行栈,异步任务进入Event Queue 。当主线程的任务执行完毕为空,会去Event Queue 读取对应任务,推入主线程去执行。此过程也叫事件循环

宏任务与微任务

宏任务是由宿主发起的,而微任务是由js发起的
微任务会先运行,宏任务会后运行

宏任务:js任务队列里的任务,严格按照时间顺序执行
微任务:需要在当前任务执行结束后立即执行的任务 698814-20180906145003189-254912994.jpg

运行机制: 1.在执行栈中执行一个宏任务
2.执行过程中遇到微任务,将微任务添加至为任务队列中
3.当宏任务执行完毕,立即执行微任务队列中的任务
4.当前微任务队列中的任务执行完毕,检查渲染,GUI线程接管渲染
5.渲染完毕后,js线程接管,开启下一次事件循环,执行下一次宏任务