JavaScript事件循环机制

JavaScript事件循环机制众所周知 JS 是一门单线程执行环境的语言 对于同步任务而言 同一时刻只能执行一个任务 后续的任务都要在当前执行的任务后面排队 这种模式在遇到一些执行时间较长的任务的时候就会出问题 会导致页面失去响应 所以这些时间较长的任务我们在编写的时候一般会把他们用异步的方式去调用 并指定任务完成时对结果进行后续处理的回调函数 而 JS 的事件循环机制就是负责对这些同步任务和异步任务的执行顺序进行调度的 Ja

众所周知JS是一门单线程执行环境的语言,对于同步任务而言,同一时刻只能执行一个任务,后续的任务都要在当前执行的任务后面排队。这种模式在遇到一些执行时间较长的任务的时候就会出问题,会导致页面失去响应。所以这些时间较长的任务我们在编写的时候一般会把他们用异步的方式去调用,并指定任务完成时对结果进行后续处理的回调函数。而JS的事件循环机制就是负责对这些同步任务和异步任务的执行顺序进行调度的。

JavaScript的函数堆栈以及任务队列

异步任务的类型以及事件循环的过程

接下来用几个例子来更直观地描述事件循环的过程,现在存在如下代码:

console.log('golb1'); setImmediate(function() { 
    console.log('immediate1'); process.nextTick(function() { 
    console.log('immediate1_nextTick'); }) new Promise(function(resolve) { 
    console.log('immediate1_promise'); resolve(); }).then(function() { 
    console.log('immediate1_then') }) }) setTimeout(function() { 
    console.log('timeout1'); process.nextTick(function() { 
    console.log('timeout1_nextTick'); }) new Promise(function(resolve) { 
    console.log('timeout1_promise'); resolve(); }).then(function() { 
    console.log('timeout1_then') }) setTimeout(function() { 
    console.log('timeout1_timeout1'); process.nextTick(function() { 
    console.log('timeout1_timeout1_nextTick'); }, 0); setImmediate(function() { 
    console.log('timeout1_setImmediate1'); }) }); }, 0); new Promise(function(resolve) { 
    console.log('glob1_promise'); resolve(); }).then(function() { 
    console.log('glob1_then') }) process.nextTick(function() { 
    console.log('glob1_nextTick'); })
 golb1 globl_promise glob1_nextTick glbl1_then timeout1 timeout1_promise timeout1_nextTick timeout1_then immediate1 immediate1_promise immediate1_nextTick immediate1_then timeout1_timeout1 timeout1_timeout1_nextTick timeout1_setImmediate1
 
  
"outer">
"inner">
var outer = document.querySelector('.outer'); var inner = document.querySelector('.inner'); // Let's listen for attribute changes on the // outer element new MutationObserver(function() { console.log('mutate'); }).observe(outer, { attributes: true }); // Here's a click listener… function onClick() { console.log('click'); setTimeout(function() { console.log('timeout'); }, 0); Promise.resolve().then(function() { console.log('promise'); }); outer.setAttribute('data-random', Math.random()); } inner.addEventListener('click', onClick); outer.addEventListener('click', onClick);

按照图中的代码描述,现在如果我们点击了子div,也就是class为inner的div,那么控制台的输出会是什么呢?

在这里揭晓答案:

click promise mutation click promise mutation timeout timeout

不过,如果将上述点击事件的触发方式修改一下,却会出现不同的结果,我们在上述代码的最后添加一行:

//....省略上述代码 inner.click();

我们将点击inner触发点击事件改为用JS代码显式调用点击事件方法,去触发onClick,在这种情况下,上述代码在控制台的输出结果会变为:

click click promise mutation promise timeout timeout
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222687.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:12
下一篇 2026年3月17日 下午3:12


相关推荐

  • java代码到opcode_OPcode简介

    java代码到opcode_OPcode简介运行一段 PHP 代码主要有两个阶段 编译和执行 当然编译过程中还包括词法分析语法分析不同阶段和细节 这里我们将其作为一个整体 在这两个阶段之间 PHP 代码会被编译成 opcode 可以将其认为是引擎的一个中间语言 编辑阶段把 PHP 源码生成 opcode 然后在执行阶段执行这些 opcode 这篇文章将简单的介绍 opcode PHP 代码编译之后会生成许多的 op 每一个 op 都是一个 zend op 类型

    2026年3月17日
    1
  • npm ERR! code E404 npm ERR! 404 Not Found – GET https://registry.npmjs.com/@mlamp%2fuser-info-dropdo

    npm ERR! code E404 npm ERR! 404 Not Found – GET https://registry.npmjs.com/@mlamp%2fuser-info-dropdonpmERR!codeE404npmERR!404NotFound-GEThttps://registry.npmjs.com/@mlamp%2fuser-info-dropdown-Notfound当我npminstall的时候出现这个错误原因是npm源指向的问题执行:npmconfigsetregistryhttps://registry.npmjs.org/问题的原因出现在:在Vue/react/angular框架中打包和编译时报错。使用指令为项目

    2025年7月30日
    7
  • 大数据Hadoop(六):全网最详细的Hadoop集群搭建

    大数据Hadoop(六):全网最详细的Hadoop集群搭建目录 Hadoop 集群搭建集群简介集群部署方式 1 Standalonemo 独立模式 2 Pseudo Distributedm 伪分布式模式 3 Clustermode 群集模式 单节点模式 高可用 HA 模式集群环境准备 hadoop 重新编译为什么要编译 hadoopHadoop 编译实现 Hadoop 安装 Hadoop 安装包目录结构 Hadoop 配置文件修改数据目录创建和文件分发 配置 Hadoop 的环境变量

    2026年3月18日
    2
  • 5g切片技术详解_5G切片SLA

    5g切片技术详解_5G切片SLA网络切片是5G网络的关键特征,可以在共享的基础设施上构建专用的逻辑网络。5G网络切片代表了一种网络架构,它允许独立和虚拟化的逻辑网络复用同一个物理网络基础设施。每个切片都是一个独立的端到端网络,以满足特定应用程序的各种需求。其实,切片在5G中并不是一个新概念,在4G中也存在(例如,APN、MORAN和GWCN),但其能力有限,因为它们不像在5G中那样支持完整的端到端解决方案。简单起见,假设运营商网络是一块大蛋糕,我们将其分成几片。每片包含整个网络的一部分,包括无线网络、传输网络和核心网络。此外,。。…

    2022年10月3日
    4
  • Python中通过PyPDF2实现PDF添加水印

    Python中通过PyPDF2实现PDF添加水印场景PyPDF2是一个纯pythonPDF库,能够分割、合并、裁剪和转换PDF文件的页面。它还可以向PDF文件中添加自定义数据、查看选项和密码。它可以从PDF检索文本和元数据,还可以将整个文件合并在一起。PyPDF21.26.0文档:https://pythonhosted.org/PyPDF2/实现使用pip安装pypddf2新建文件夹waterPDF在…

    2022年6月23日
    25
  • 深入浅出–Linux基础命令知识(总结,配图文解释)

    深入浅出–Linux基础命令知识(总结,配图文解释)前言 在学习 Linux 时候想必大家都会遇到一个问题 就是 Linux 中命令太多了 今天博主给大家总结总结收集一下咱们最常用到的命令 在本博主用的操作系统中感觉 Ubuntu 是比较好用的 所以一切都在 Ubuntu 中 但是命令不影响啥 Linux 基础命令 一 用户目录 二 常用的 Linux 命令 1 ls 2 tree 3 pwd 4 clear 5 cd 命令集合 三 路径 1 绝对路径 2 相对路径 四 隐藏技能 五 文件命令 1 touch 2 mkdir 3 rm 4 rmdir 5 cp 6 mv 六 终

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号