返回
一文点透事件循环、同步异步与宏任务微任务
前端
2023-10-05 20:58:09
时光荏苒,白驹过隙。转眼间,前端江湖风云变幻,层出不穷的框架层叠而出,让初入前端领域的少侠们应接不暇。而事件循环、同步异步、宏任务微任务这些前端进阶路上的拦路虎,更是让不少江湖侠客望而生畏。今天,我们就来一文点透这些概念,助少侠们一举突破,闯荡前端江湖。
同步与异步
在前端的世界中,同步和异步犹如两极。同步操作是指程序按照顺序依次执行,前一个操作完成后才执行后一个操作。而异步操作则相反,后一个操作可以在前一个操作未完成时就开始执行。
同步操作示例:
console.log('同步操作1');
console.log('同步操作2');
异步操作示例:
setTimeout(() => {
console.log('异步操作1');
}, 0);
console.log('异步操作2');
在上面的示例中,同步操作会按照顺序依次输出结果,而异步操作则会先输出"异步操作2",然后才会输出"异步操作1"。这是因为异步操作被交给了浏览器提供的异步执行环境,浏览器会根据自己的调度机制来执行这些操作。
事件循环
事件循环是浏览器用来管理和执行异步任务的机制。它不断循环,检查是否有待执行的异步任务,如果有,则将其取出并执行。
事件循环的运作流程:
- 执行同步任务。
- 检查是否有待执行的宏任务,如果有,则执行宏任务。
- 检查是否有待执行的微任务,如果有,则执行微任务。
- 重复步骤1-3,直到所有任务执行完毕。
宏任务与微任务
宏任务和微任务是事件循环中执行异步任务的两种不同类型。
宏任务:
- 由 JavaScript 引擎创建。
- 包括
setTimeout
、setInterval
和 DOM 事件等任务。 - 在事件循环中,宏任务会在微任务执行完毕后执行。
微任务:
- 由 JavaScript 引擎创建。
- 包括
Promise
、MutationObserver
和process.nextTick
等任务。 - 在事件循环中,微任务会在宏任务执行完毕后执行,并且会优先于下一次宏任务执行。
宏任务和微任务的执行顺序:
- 同步任务。
- 微任务。
- 宏任务。
举例说明
setTimeout(() => {
console.log('宏任务1');
}, 0);
Promise.resolve().then(() => {
console.log('微任务1');
});
console.log('同步任务');
在上面的示例中,同步任务会先执行,然后微任务会优先执行,最后宏任务才会执行。
总结
事件循环、同步异步、宏任务微任务是前端进阶路上的重要概念。掌握这些概念,对于编写高性能、响应式的前端应用至关重要。