任务
在JavaScript中,所有任务可以分为两种,一种是同步任务,一种是异步任务。
同步任务:同步任务是在主线程(这个线程用来解释和执行 JavaScript 代码)上排队执行的任务。
异步任务:不进入主线程、而进入任务队列的任务。只有当主线程上的所有同步任务执行完毕之后,主线程才会读取任务队列,将任务放到执行栈,开始执行任务。(例如:ajax请求、setTimeout等事件调用的回调函数)
任务队列
当遇到计时器(setTimeout)、DOM事件监听或者是网络请求的任务时,JS引擎会将它们直接交给浏览器提供的相应线程去处理,而JS引擎线程继续后面的其他任务,这样便实现了 异步非阻塞。 当任务在相应的子线程上执行完成之后,再调回到主线程上,由JS引擎继续执行。
JavaScript中有两类任务(事件)队列:宏任务队列和微任务队列。
异步任务的队列优先级: 异步宏任务先执行 然后在执行异步微任务
事件循环
JS引擎在执行任务时,同步任务和异步任务是在不同的线程上执行的,同步任务在主线程上先执行,异步任务在子线程上执行,在子线程上执行完之后再调回主线程处理。
先执行第一轮的异步宏任务中的代码,先是同步任务执行,再是异步微任务执行,然后才是下一轮排队的宏任务;而下一轮排队的宏任务执行时,又是先同步任务再微任务,如果有宏任务再让其继续排队,最后再执行下一轮排队的宏任务......之后一直这样循环下去,直到所有任务执行完毕。