js 是单线程执行,虽然增加了一个 worker 创造了多线程环境,但 worker 受限很多,本质上还是一个单线程。 js 执行是有一个执行栈,主要分了同步任务和异步任务,异步任务又分宏任务(macro-task)和 微任务(micro-task)。
宏任务有:
微任务有:
看下面这个案例,console.log从上到下,1到8排列。那么打印的结果是什么呢?
只要记住了上述罗列的宏任务和微任务,就可以轻松解答了。说到底就是一道记忆题。
第一:从上到下执行,三个同步任务,打印1,6,8.
第二:处理异步任务,先找微任务,打印 7.
第三:处理宏任务(同一层,图中绿线),先执行时间少的。打印内部的 同步任务3,异步微任务4. 此时又有一个宏任务setTimeout,可是时间比外层宏任务setTimeout 还要长。
第四:先执行外层2秒的宏任务,打印2,再执行内层3秒宏任务,打印5.
外层绿框是第一次比较的宏任务,先执行①;红框是内层和外层第二次比较的宏任务,先执行②;最后执行③。
实际上并没有内层外层的说法,下方绿框执行完毕之后就剩下③,然后③和②比较时间长短,决定谁先执行。③也不是等上3000毫秒,即3秒,而是
一秒后打印3,4,再一秒后打印2,再一秒后打印5.