当前位置:网站首页>简单理解 JS 事件循环
简单理解 JS 事件循环
2022-08-04 19:51:00 【无知小九】
因为 js 是单线程运行的,在代码执行的时候,通过将不同函数的执行上下文压入执行栈中来保证代码的有序执行。在执行同步代码的时候,如果遇到了异步事件,js 引擎并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。当异步事件执行完毕后,再将异步事件对应的回调加入到与当前执行栈中不同的另一个任务队列中等待执行。任务队列可以分为宏任务对列和微任务对列,当当前执行栈中的事件执行完毕后,js 引擎首先会判断微任务对列中是否有任务可以执行,如果有就将微任务队首的事件压入栈中执行。当微任务对列中的任务都执行完成后再去判断宏任务对列中的任务。
微任务包括了 promise 的回调、node 中的 process.nextTick 、对 Dom 变化监听的 MutationObserver。
宏任务包括了 script 脚本的执行、setTimeout ,setInterval ,setImmediate 一类的定时事件,还有如 I/O 操作、UI 渲染等。

简单来说
Js 是单线程运行的, 异步要基于回调来实现
而 event loop 就是异步回调的实现原理
JS 如何执行: 一行行执行, 先把同步执行完再执行异步
同步代码, 一行一行放在 Call Stack 执行
遇到异步, 先记录下, 等待时机(定时, 网络请求等)
时机到了, 移动到 Callback Queue
Callstack 为空(同步代码执行完), Event Loop开始工作
轮询查找 Callback Queue, 如有则移动到 Call Stack 执行
继续轮训查找(永动机一样)
边栏推荐
猜你喜欢
随机推荐
哈佛架构 VS 冯·诺依曼架构
如何手动下载并安装 Visual Studio Code 的 SAP Fiori tools - Extension Pack
密码学系列之:PEM和PKCS7,PKCS8,PKCS12
取证程序分类
A complete cross-compilation environment records the shell scripts generated by peta
JSD-2204-酷莎商城(管理员模块)-密码加密-Day10
awk 统计平均 最大 最小值
How to add custom syntax to MySQL?
Polygon zkEVM 基本概念
数据安全解决方案的发展
nr part calculation
03 ts类型缩小,函数
hash和history路由的区别
二叉树的前序遍历
宏定义小方法
The book "The Essence of Alipay Experience Design", a record of knowledge related to testing
How to manually download and install SAP Fiori tools - Extension Pack for Visual Studio Code
SAP UI5 的初始化过程
c sqlite ... ...
使用.NET简单实现一个Redis的高性能克隆版(二)









