js中什么是事件循环
原创JavaScript中的事件循环
在JavaScript中,事件循环是一种处理程序执行、事件和消息分发的机制。由于JavaScript是单线程的,意味着它一次只能执行一个任务,事件循环机制允许JavaScript引擎在处理其他操作(如用户交互、IO操作等)的同时,保持响应性和执行其他代码的能力。
事件循环的工作原理
JavaScript的运行环境首要由以下几个部分组成:
- 调用栈(Call Stack):这是代码执行的地方,函数依次被推入栈中并执行。
- 事件队列(Event Queue):当异步事件出现时(例如,一个HTTP请求完成,或者定时器触发),相应的回调函数会进入事件队列等待执行。
- 事件循环:事件循环逐步地检查调用栈是否为空,如果为空,它就会从事件队列中取出第一个回调函数并将其推入调用栈执行。
宏任务与微任务
在事件循环中,任务被分为两种类型:宏任务(Macrotasks)和微任务(Microtasks)。
宏任务通常包括:脚本执行、定时器(setTimeout、setInterval)、用户交互事件(如点击、键盘事件)、IO操作等。
微任务则通常包括:Promise的回调、MutationObserver等。
事件循环的执行过程如下:
- 执行宏任务,并且在执行过程中如果遇到微任务,将其添加到微任务队列。
- 当前宏任务执行完毕后,立即执行所有微任务队列中的任务。
- 微任务队列清空后,事件循环会检查是否有下一轮的宏任务待执行,如果有,重复步骤1。
示例代码
// 以下代码展示了事件循环中宏任务与微任务的执行顺序
console.log('Script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
Promise.resolve().then(function() {
console.log('Promise 1');
}).then(function() {
console.log('Promise 2');
});
console.log('Script end');
// 输出导致:
// Script start
// Script end
// Promise 1
// Promise 2
// setTimeout
从上面的示例中可以看出,即使定时器被设置为0毫秒延迟,它仍然会在所有微任务执行完毕之后才被执行,这是出于定时器是宏任务,而Promise的回调是微任务。
总结
JavaScript的事件循环机制促使单线程的JavaScript能够执行错综的任务和保持高响应性。了解事件循环对于掌握异步编程非常重要,它可以帮助开发者编写出高效、合理的代码。