[TOC]
为什么要搞懂这些概念?
总所周知,JavaScript是一门单线程、异步、非阻塞、解析类型的脚本语言
JavaScript的设计就是为了处理浏览器网页的交互(DOM操作、UI动画等)。当主线程在解析HTML生成DOM树的过程中会执行style、layout、render以及compisite的操作,而JS可以操作DOM,CSSOM,这会影响到主线程在解析HTML的最终渲染结果,最终页面的渲染结果将变得不可预见,这也决定了它是一门单线程语言。
当遇到定时器、DOM事件监听或者AJAX请求时,JS会将这些任务暂存起来,等到同步任务执行完毕之后再来执行这些任务。这些异步任务的执行顺序就成了一个问题。而JavaScript巧妙的通过事件循环(event Loop)机制来解决了这个问题。
需要说明的是,本文所有内容都是基于浏览器环境
定义
消息队列
消息队列是浏览器用来暂存异步任务的执行队列,等待JS引擎到合适的时机取出调用(满足先进先出的原则)。
事件循环
JS引擎执行事件操作的一种机制,其规则是:
JS的主线程每次只能同时执行一个任务,所以线程会优先执行同步任务,每次执行完所有的同步任务后再检查消息队列中是否存在微任务;如果微任务队列不为空时,则先执行完所有的微任务,再执行下一次的宏任务;当微任务队列为空时,则判断是否需要进行页面渲染(重排),如果需要则进行页面渲染;如果不需要则进行下次循环,直到执行完所有的任务队列
宏任务
浏览器中可以用来执行异步任务的方法,其主要有:
