JavaScript:事件循环机制(EventLoop)

简介: 【9月更文挑战第6天】JavaScript:事件循环机制(EventLoop)

JavaScript 的事件循环机制(EventLoop)是 JavaScript 运行时环境(如浏览器和 Node.js)中用于处理异步事件和回调的一种机制。它允许 JavaScript 代码在单线程中运行,同时又能执行异步操作(如网络请求、文件读取等),而不会阻塞主线程的执行。

JavaScript 运行环境

在 JavaScript 中,有一个调用栈(Call Stack)用于存储当前执行中的函数调用。当代码执行时,它会被压入调用栈,当函数执行完成后,它会被从调用栈中弹出。由于 JavaScript 是单线程的,同一时间只能有一个任务在调用栈中执行。

异步操作和事件队列

当 JavaScript 执行异步操作时(如 setTimeout、Promise、网络请求等),这些操作不会立即执行,而是会被放到任务队列(Task Queue)或微任务队列(Microtask Queue)中等待。这些队列与调用栈是分离的,但它们会在某个时刻与调用栈进行交互。

  • 任务队列(Task Queue):通常用于处理宏任务(Macrotasks),如 setTimeout、setInterval、I/O、UI 渲染等。
  • 微任务队列(Microtask Queue):用于处理微任务(Microtasks),如 Promise.then、MutationObserver 等。微任务通常比宏任务有更高的优先级,会在每个宏任务执行结束后立即执行。

事件循环

事件循环是 JavaScript 运行时环境中用于不断循环执行以下步骤的机制:

  1. 检查调用栈:如果调用栈为空,则继续执行;如果调用栈不为空,则等待调用栈中的任务执行完毕。

  2. 执行微任务队列:一旦调用栈为空,事件循环会查看微任务队列。如果微任务队列中有任务,它会将队列中的所有微任务依次取出并执行,直到微任务队列为空。每执行完一个宏任务后,都会立即执行完所有的微任务。

  3. 执行宏任务:在微任务队列为空后,事件循环会查看任务队列。如果任务队列中有任务,它会取出队列中的第一个宏任务放入调用栈执行。执行完毕后,再次回到第一步,检查调用栈是否为空,并执行微任务队列中的任务(如果有的话),然后再次从任务队列中取出下一个宏任务执行,如此循环往复。

示例

console.log('1');

setTimeout(() => {
   
    console.log('2');
}, 0);

Promise.resolve().then(() => {
   
    console.log('3');
});

console.log('4');

// 输出顺序: 1 -> 4 -> 3 -> 2
// 解释:
// 1 和 4 同步执行,立即输出。
// setTimeout 被推入宏任务队列。
// Promise.then 被推入微任务队列。
// 同步代码执行完毕后,检查微任务队列并执行,输出 3。
// 随后执行宏任务队列中的 setTimeout,输出 2。

总结

JavaScript 的事件循环机制使得 JavaScript 能够在单线程环境中执行异步操作而不会阻塞主线程。通过任务队列和微任务队列,JavaScript 能够高效地管理异步任务,并保证了异步操作的顺序性和响应性。

目录
相关文章
|
7月前
|
消息中间件 存储 前端开发
JavaScript高级主题:解释一下 JavaScript 中的事件循环(Event Loop)。
JavaScript高级主题:解释一下 JavaScript 中的事件循环(Event Loop)。
63 0
|
2月前
|
存储 JavaScript 前端开发
深入理解JavaScript中的事件循环(Event Loop):机制与实现
【10月更文挑战第12天】深入理解JavaScript中的事件循环(Event Loop):机制与实现
120 3
|
3月前
|
JavaScript 前端开发 API
详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
该文章详细讲解了队列数据结构在前端开发中的应用,并深入探讨了JavaScript的事件循环机制,区分了宏任务和微任务的执行顺序及其对前端性能的影响。
|
2月前
|
前端开发 JavaScript
深入理解JavaScript中的事件循环(Event Loop):从原理到实践
【10月更文挑战第12天】 深入理解JavaScript中的事件循环(Event Loop):从原理到实践
44 1
|
5月前
|
JavaScript
js【详解】event loop(事件循环/事件轮询)
js【详解】event loop(事件循环/事件轮询)
58 0
|
5月前
|
JavaScript 前端开发 API
js 运行机制(含异步机制、同步任务、异步任务、宏任务、微任务、Event Loop)
js 运行机制(含异步机制、同步任务、异步任务、宏任务、微任务、Event Loop)
50 0
|
7月前
|
存储 JavaScript 前端开发
JS的执行原理,一文了解Event Loop事件循环、微任务、宏任务
了解JavaScript的事件循环和任务队列对于处理异步任务至关重要。事件循环由主线程和任务队列组成,当主线程执行完同步任务后,会检查任务队列,按顺序执行宏任务和微任务。宏任务包括`setTimeout`等,微任务如`Promise`的回调。在实际开发中,事件循环保证了代码的非阻塞执行,提高了用户体验。例如,`setTimeout`的回调会在当前宏任务结束后,所有微任务执行完才会执行。理解这一机制对于解决面试中的异步问题非常有帮助。
79 0
JS的执行原理,一文了解Event Loop事件循环、微任务、宏任务
|
7月前
|
JavaScript 前端开发
前端 JS 经典:宏任务、微任务、事件循环(EventLoop)
前端 JS 经典:宏任务、微任务、事件循环(EventLoop)
68 0
|
7月前
|
前端开发 JavaScript
深入理解JavaScript的事件循环(Event Loop)
深入理解JavaScript的事件循环(Event Loop)
|
JavaScript 前端开发 API
(译)看得见的 JavaScript:事件循环(Event Loop)
(译)看得见的 JavaScript:事件循环(Event Loop)
92 1