视频加载失败

Event Loop

440 字
2 分钟
Event Loop

简单来说,知道了Event Loop,其实就是知道了代码执行的优先级:先call stack,后mircotask quene,最后work quene

  • call stack中存放了同步函数,例如console.log()、setTimeout()等
  • mircotask quene中存放了Promise中的resolve()函数
  • work quene中存放了各种回调函数

以下面的代码为例:

setTimeout(() => {
console.log("timeout");
}, 10);
Promise.resolve().then(() => console.log("Promise"));
console.log("Others");

下面是代码的执行流程:

  1. 首先setTimeout()函数会进入call stack中
  2. 由于setTimeout()中存在回调函数,因此() => console.log('timeout')会进入work quene中
  3. Promise.resolve()进入call stack中,由于resolve()中的函数中没有代码执行,因此会被弹出call stack,紧接着then()进入call stack,由于then()中存在resolve的中间处理逻辑,因此() => console.log('Promise')会进入microtask quene中
  4. console.log('Others')是同步函数,进入call stack,执行后出栈
  5. call stack栈空后,先执行microtask quene中的函数,里面只有() => console.log('Promise')
  6. 最后执行work quene中的函数,里面只有() => console.log('timeout')

因此最后函数的打印顺序为:Others、Promise、timeout

最初js的代码执行逻辑还是比较复杂的,但在引入async和await之后,就可以将所有的异步函数进行同步处理,确保了代码的执行顺序和编写顺序一致

nodejs在组成上包含了v8引擎和libuv,其中v8引擎负责代码的执行,比如call stack和microtask quene中的代码,event loop也是由v8引擎提供的,而libuv是一个多线程模型,用于处理work quene中的回调函数和一些耗时耗力的操作

很多网站都推荐使用Chrome进行访问,其中的原因之一,就是v8引擎是浏览器内置的js引擎中性能最好的,而Chrome中使用的就是v8

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Event Loop
https://shizuku.halory.fun/posts/Event Loop/
作者
Shizuku
发布于
2026-08-31
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Shizuku
我们仍会摆脱世俗偏见,我们仍将从中获取力量
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
15
分类
8
标签
19
总字数
16,450
运行时长
0 天
最后活动
0 天前

当前页面没有目录