事件循环
基本知识
- js是单线程的,一次只能做一件事
- 浏览器是多线程的,js引擎线程只是浏览器其中一个线程,其他还有GUI渲染线程、事件触发线程、定时器线程、定时器线程、http请求线程等
- 浏览器在执行js代码时会维护两样东西—执行栈与任务队列
执行栈
函数调用栈,用于存放各种函数的执行环境。
函数调用之前,创建执行环境,然后加入到执行栈,函数调用之后,销毁执行环境。
js 引擎每次执行的都是执行栈顶的代码。
任务队列
js 中异步操作的回调函数都会放入这个队列中,当执行栈代码执行完成之后会从队列中取出一个函数放到执行栈中去执行。
队列遵循先进先出。
任务队列分为宏任务队列和微任务队列
宏任务和微任务
宏任务:setTimeout,setInterval,setImmediate,http,页面事件交互
微任务:Promise process.nextTick
微任务优先级永远大于宏任务
总结
事件循环就是执行栈的代码执行完之后,在微任务队列取一个事件放到执行栈中执行,当微任务队列为空时,就从宏任务中取一个事件放到执行栈中执行,如此反复循环
面试题
setTimeout(() => {
console.log(1);
}, 0);
new Promise((resolve) => {
console.log(2);
resolve();
}).then(() => {
console.log(3);
});
console.log(4);