首页 > 文章列表 > 为什么 JavaScript 永不休眠:事件循环简单指南

为什么 JavaScript 永不休眠:事件循环简单指南

281 2024-10-31

javascript 作为一种单线程语言: 简要提及 javascript 如何一次只处理一个任务,但事件循环让它看起来并非如此

事件循环如何工作:事件循环过程中的关键步骤

  • 堆栈: 调用堆栈管理同步代码。

  • 队列:回调队列保存等待执行的任务。

  • 循环: 事件循环在
    之前检查堆栈是否为空 将任务从队列移动到堆栈。

为什么 JavaScript 永不休眠:事件循环简单指南

工作流程细分:

初始代码执行:

console.log('Hi');
$.get('url', function cb(data) {
  console.log(data);
});
console.log('JSConfEU');

  • 当此代码开始执行时,console.log('hi') 会添加到调用堆栈中,并在控制台中打印“hi”。

异步函数调用($.get):

  • 接下来,遇到 $.get('url', function cb(data) { ... }) 。此函数发起 http 请求以从“url”检索数据。

  • 请求不会阻塞主线程,而是发送到 web api 环境(通常是浏览器的一部分)。

  • 回调函数 (cb) 被注册为在 http 请求完成后执行,但不会立即执行。 http 请求继续在 web api 部分加载,标记为 xhr (xmlhttprequest),这通常用于处理网络请求。

移动到下一个同步行:

  • javascript 移至下一行 console.log('jsconfeu'),该行已添加到调用堆栈中。然后“jsconfeu”被打印到控制台。

事件循环和任务队列:

  • 完成所有同步代码后,调用堆栈变空,javascript 等待任何异步任务完成。

  • http 请求完成后,回调函数 (cb) 将从 web api 移至任务队列。

  • 事件循环不断检查调用堆栈是否为空,当为空时,事件循环将任务从任务队列移动到调用堆栈

回调执行:

  • 当事件循环将回调函数放入调用堆栈时,它会执行console.log(data);在回调函数中,将从 http 请求接收到的数据打印到控制台。

摘要:

此流程演示了事件循环如何处理异步代码
作者:

  • 立即在调用堆栈上处理同步代码。

  • 处理 web api 中的异步任务,完成后将其移至任务队列。

  • 允许事件循环仅在调用堆栈为空时将任务移至调用堆栈,确保非阻塞代码执行。

来源:https://dev.to/vamstroy/why-javascript-never-sleeps-an-easy-guide-to-the-event-loop-9hm

本类最新

查看更多