什么是事件循环?
JavaScript是一种单线程语言,意味着它一次只能执行一个任务。然而,通过事件循环,JavaScript可以处理异步操作而不会阻塞主线程。
事件循环的核心思想是不断地从任务队列中取出任务并执行,然后再检查是否有新的任务进入队列。这个过程循环进行,因此得名“事件循环”。
事件循环的三个重要组成部分:
1. 调用栈(Call Stack)
调用栈用于存储执行上下文,每个函数调用都会在调用栈中创建一个新的执行上下文。当函数执行完成,执行上下文从栈中弹出。
function foo() {
console.log('foo');
}
function bar() {
foo();
console.log('bar');
}
bar();
在上面的例子中,调用栈的状态会依次为:bar -> foo -> (empty)
。
2. 任务队列(Task Queue)
任务队列存储待执行的任务,每个任务都是一个函数。当调用栈为空时,事件循环会从任务队列中取出一个任务并放入调用栈中执行。
setTimeout(() => {
console.log('Timeout callback');
}, 1000);
上述代码中,setTimeout
的回调函数将在1秒后被添加到任务队列中。
3. 事件循环(Event Loop)
事件循环是一个持续运行的进程,不断地从任务队列中取出任务并将其推送到调用栈中执行。这个过程会一直进行,直到任务队列为空。
console.log('Start');
setTimeout(() => {
console.log('Timeout callback');
}, 1000);
console.log('End');
上述代码的执行过程如下:
- 执行第一个
console.log('Start')
,输出Start
。 - 遇到
setTimeout
,将其回调函数添加到任务队列中。 - 执行第二个
console.log('End')
,输出End
。 - 调用栈为空,事件循环将从任务队列中取出
setTimeout
的回调函数执行,输出Timeout callback
。
希望通过本文的讲解,大伙对JavaScript事件循环有了更清晰的认识。