目录
何为宏任务、微任务
事件循环:JS 会创建一个类似于
while (true)
的循环,每执行一次循环体的过程称之为Tick
。每次Tick
的过程就是查看是否有待处理事件,如果有则取出相关事件及回调函数放入执行栈中由主线程执行。待处理的事件会存储在一个任务队列中,也就是每次Tick
会查看任务队列中是否有需要执行的任务。主线程:JS 只有一个线程,称之为主线程。而事件循环是主线程中执行栈里的代码执行完毕之后,才开始执行的。所以,主线程中要执行的代码时间过长,会阻塞事件循环的执行,也就会阻塞异步操作的执行。只有当主线程中执行栈为空的时候(即同步代码执行完后),才会进行事件循环来观察要执行的事件回调,当事件循环检测到任务队列中有事件就取出相关回调放入执行栈中由主线程执行。
js是单线程的,单线程意味着任务需要排队,如果前一个任务耗时长,那么就会阻塞后续任务的执行。为此js出现了同步和异步任务,这两种任务都是要在主线程执行栈中执行的,但是,异步任务会放到任务队列中进行排队执行。
而任务队列中就分为了宏任务、微任务。(说白了就是个名字而已,就是被叫做微任务的异步任务的执行优先级更高,先执行,而宏任务(同样是异步任务)的执行优先级比微任务低,得等微任务执行完才能轮到宏任务)
执行顺序
同步任务>微任务>宏任务
运行机制
同步任务在主线程上执行,形成一个执行栈
js会将主线程执行栈中的异步任务置于任务队列排队
一旦主线程执行栈同步任务执行完毕处于空闲状态时,就会将任务队列中任务入栈开始执行
常见的宏任务
setTimeout、setInterval
常见的微任务
promise中的then、async、await