JavaScript 作为是一门单线程语言,使用事件循环(Event Loop)机制,来执行代码和收集回调队列的子任务。
Event Loop 的运行机制
1.JavaScript 运行时主线程有一个调用栈
2.任务在调用栈
中执行完毕出栈
3.任务执行过程可能产生异步任务,异步任务会在有结果时进入回调队列
等待执行
4.栈为空时回调队列
的任务入栈
宏任务和微任务
每次只会取出一个宏任务执行,但会一次性取出所有微任务执行。
requestAnimationFrame 的回调即不是宏任务,也不是微任务,它在微任务执行完毕后执行。
宏任务
script 代码、setTimeout、setInterval、Promise微任务
Promise.then, Promise.catch
下面是经典宏任务与微任务经典面试题:
输出依次为:
“script start”, “script end”, “promise 1”, “error caught”, “errorFunc”, “promise 2”, “errorFunc then res”, “setTimeout”
1 | console.log("script start"); |