首先JavaScript是一种单线程语言,这意味着它只能同时执行一个任务。当JavaScript在执行代码时,它会将所有事件添加到一个事件队列中,例如点击鼠标或键盘输入。事件循环是JavaScript中的一种机制,它通过不断地查询事件队列来执行事件。
事件循环的核心机制是事件循环队列。该队列包含两种类型的事件:宏任务和微任务。宏任务在事件循环队列中是排队等待的任务,这包括所有的DOM事件、定时器事件和网络请求等。微任务则是指在宏任务执行之前需要执行的任务,这包括一个 Promise 的回调函数、主动调用的执行器(promise.then)和 MutationObserver等。
在JavaScript中,当执行完当前宏任务时,事件循环会查找微任务队列,如果有微任务,则按照顺序执行所有的微任务。一旦微任务完成后,事件循环会再次查找宏任务队列并执行下一个宏任务。
以下是一个事件循环的示例代码:
console.log('start');
setTimeout(function() {
console.log('timeout1');
}, 0);
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});
console.log('end');
输出结果为:
start
end
promise1
promise2
timeout1
在这个例子中,事件循环会遵循以下步骤:
- 输出 "start"。
- 添加定时器事件(宏任务)。
- 添加两个 Promise 的回调函数(微任务)。
- 输出 "end"。
- 当前宏任务完成,执行微任务队列中的回调函数。输出 "promise1" 和 "promise2"。
- 检查宏任务队列,发现有一个定时器任务,执行该任务。输出 "timeout1"。