eventLoop 事件循环

js是单线程脚本语言,开发中了解代码执行顺序就显得格外重要,代码从上往下执行过程中 如果所有都是同步任务,将会造成严重的性能问题。

异步分为宏任务和微任务

宏任务(MacroTask)

script全部代码、setTimeoutsetIntervalsetImmediate(浏览器暂时不支持,只有IE10支持,具体可见MDN)、I/OUI Rendering

微任务(MicroTask)

Process.nextTick(Node独有)PromiseObject.observe(废弃)MutationObserver(具体使用方式查看这里

js中有一个主线程和执行栈,所有任务都会被放到调用栈等待主线程执行

浏览器将获取到的html 从上到下执行过程中 遇到script后,第一个宏异步任务就开始了,script从上到下执行所包含的js代码,会将同步任务按照先后顺序放入执行栈中等待主线程依次执行,当程序出现微异步任务时,会将微异步任务放入微任务队列中,出现宏任务会将宏任务放入宏任务队列中。

当执行栈同步任务执行完成后,调用栈被清空,这时会去检测微任务队列是否为空,如果不为空,会按照先入先出的规则,执行完所有微任务可以执行的微任务。

如果微任务队列为空,会去执行宏任务,每单个宏任务执行完毕,都回去检测微任务队列是否为空,不为空的话,会按照先入先出规则去执行所有可以执行的微任务。然后在执行宏任务。如此循环

主栈程每次将执行栈中任务执行完成后,就去检查事件队列中有无可执行事件,如果有,将事件推入执行栈执行。如此往复的过程就叫做"事件循环"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章