事件循环 执行栈 异步 缺陷 原理 (详解) (精华帖)

MIMO+Qwen双模协同Debug工作流实战指南 在AI辅助编程日益普及的今天,单模型泛化推理常导致debug误判与修复不可落地。本文聚焦真实后端调试场景,解析如何通过分层协同机制——以MIMO Pro V2为代码层‘精准定位引擎’,Qwen 3.6 Plus为跨层‘归因分析中枢’——实现从日志现象到系统级根因的阶梯式收敛。该方案不依赖大参数量或付费服务,强调结构化输入、约束式提问与平台路由配置,适用于Spring微服务、分布式事务、Redis Lua脚本等典型问题,尤其契合初级后端建立调试直觉、中年程序员维护老旧系统及预算受限但追求效率的务实开发者。 阅读详情

事件循环

JS运行环境称为宿主环境。

JS运行的环境我们叫做数组环境,为神么我们要这样说呢是因为我们的目前的整个前端里面JS代码也就是ES标准代码它不仅能够运行在浏览器它还能够运行在服务器,比如说node.js,也可以运行在客户端,也可以运行在移动端,所以我们吧以前的那种刻板印象应该去掉了,他能够运行在各种环境里面,你只要给它配备了相关的js执行引擎,我们学的ES6其实是语言本身里面的东西,因为是语言本身的东西,而与原本身是可以运行在各种环境里面的。

我们学的循环,判断,像一些数组的基础操作,原型他是属于ES环境的,也就是语言本身的是去教你怎么说话的,而运行环境里面他说的话又有一些差异,但是他们的基础都是这个ES语言,而JS就像当于一个环境,浏览器环境,我们在浏览器环境里,我们把它称之为Javascript 。

js语言和ES语言实际上是有些差异的,只不过我们平常说习惯了他们是一个东西,但是你心里面要清楚这两个其实是两个东西,JavaScript他是ES里的一个超集,

在这里插入图片描述

浏览器端会给他们提供一个环境,这个环境里面不止包含了ES里面本身的规范而且还新加入了一些东西叫做WebAPI里面的dom操作,bom操作,setTimeout,dom + bom就是WebAPI,这就是浏览器为他提供的新的API,语法是没有变化的,所以浏览器端我们把他称为数组环境

而服务器端,我们把他称为node.js,他也是用得一些ES语言,循环判断等在node是完全一样的,只不过在node里面新增了一些对象,方法,所以叫做node api,我们只需要去学新增的方法就行了

执行栈(call stack)

这是一个内存空间,我们吧这块内存空间当做一个栈的话,它有点类似于一个数组,他跟那个数组有一点差异,他加入数据时始终把它加入到栈的末尾,当然这不可能是一个纯数据他有可能是一个函数有可能是任何一个东西

在这里插入图片描述

他加入数据时是不能穿插的一定得是加入到末尾,那么我们将最后插入的数据叫做栈顶,最先插入的叫做栈底,我们把往里面加入的这个过程叫做入栈,在我们的这个栈里面的数据不可能永远存在有时候我们需要吧这些数据扔掉,但是扔掉不能从中间扔掉要按照顺序从栈顶开始依次去除,我们管这种过程叫做出站(pop),入栈叫做(push),其实你看这不就跟数组的一样嘛。

执行栈:call stack,一个数据结构,用于存放各种函数的执行环境,每一个函数执行之前,它的相关信息会加入到执行栈。函数调用之前,创建执行环境,然后加入到执行栈;函数调用之后,销毁执行环境。

JS引擎永远执行的是执行栈的最顶部。

异步

异步函数:某些函数不会立即执行,需要等到某个时机到达后才会执行,这样的函数称之为异步函数。比如事件处理函数。异步函数的执行时机,会被宿主环境控制。

浏览器宿主环境中包含5个线程:

  1. JS引擎:负责执行执行栈的最顶部代码
  2. GUI线程:负责渲染页面
  3. 事件监听线程:负责监听各种事件
  4. 计时线程:负责计时
  5. 网络线程:负责网络通信

当上面的线程发生了某些事请,如果该线程发现,这件事情有处理程序,它会将该处理程序加入一个叫做事件队列的内存。当JS引擎发现,执行栈中已经没有了任何内容后,会将事件队列中的第一个函数加入到执行栈中执行。

JS引擎对事件队列的取出执行方式,以及与宿主环境的配合,称之为事件循环。

事件队列在不同的宿主环境中有所差异,大部分宿主环境会将事件队列进行细分。在浏览器中,事件队列分为两种:

  • 宏任务(队列):macroTask,计时器结束的回调、事件回调、http回调等等绝大部分异步函数进入宏队列
  • 微任务(队列):MutationObserver,Promise产生的回调进入微队列

MutationObserver用于监听某个DOM对象的变化

当执行栈清空时,JS引擎首先会将微任务中的所有任务依次执行结束,如果没有微任务,则执行宏任务。

事件和回调函数的缺陷

我们习惯于使用传统的回调或事件处理来解决异步问题

事件:某个对象的属性是一个函数,当发生某一件事时,运行该函数

	dom.onclick = function(){
	
	}

回调:运行某个函数以实现某个功能的时候,传入一个函数作为参数,当发生某件事的时候,会运行该函数。

	dom.addEventListener("click", function(){
	
	})

本质上,事件和回调并没有本质的区别,只是把函数放置的位置不同而已。

一直以来,该模式都运作良好。

直到前端工程越来越复杂…

目前,该模式主要面临以下两个问题:

  1. 回调地狱:某个异步操作需要等待之前的异步操作完成,无论用回调还是事件,都会陷入不断的嵌套
  2. 异步之间的联系:某个异步操作要等待多个异步操作的结果,对这种联系的处理,会让代码的复杂度剧增

我们来举个例子


	 <p>
        <button id="btn1">按钮1:给按钮2注册点击事件</button>
        <button id="btn2">按钮2:给按钮3注册点击事件</button>
        <button id="btn3">按钮3:点击后弹出hello</button>
    </p>
    <script>
        const btn1 = document.getElementById("btn1"),
            btn2 = document.getElementById("btn2"),
            btn3 = document.getElementById("btn3");
        btn1.addEventListener("click", function() {
            //按钮1的其他事情
            btn2.addEventListener("click", function() {
                //按钮2的其他事情
                btn3.addEventListener("click", function() {
                    alert("hello");
                })
            })
        })
    </script>

这样的话就会各种回调各种循环会很麻烦形成回调地狱,别看这是三个事件少,如果是100呢~
以上就是本篇博客的全部内容了,有什么问题欢迎评论,希望对您有用

嵌入式开发者如何构建个人技术知识库:从信息筛选到体系化输出 在嵌入式开发领域,面对碎片化的技术栈和快速迭代的工具链,高效的知识管理是工程师的核心竞争力。其本质在于构建一个持续学习与转化的系统:通过建立高质量信息源网络(如芯片厂商文档、开源项目、技术社区精华),运用‘信号与噪声’原则进行筛选,聚焦解决实际工程问题的深度内容。关键在于将信息内化为知识,这需要标准化的笔记模板(如Markdown记录核心摘要、关键要点与个人思考)和双向链接,以建立非线性的知识网络。最终,通过写作、分享等输出方式固化理解,并应对嵌入式领域知识类型多样、高度依赖具体平台、调试经验非结构化等特殊 阅读详情

相关推荐

2.2.1.3-移动平均线(python画k线、均线、5日线、买卖点图、python均线策略)

* 绘制一个k线图,也就是蜡烛图 * 计算5日均线值、10日均线值 * 在k线图上,绘制5日线和10日线图 * 在5日线上,绘制与10日线的交叉点(上穿、下穿时) python画k线、均线、5日线、买卖点图、python均线策略

KelvinLiu 3413

栈的输出_基础面试27:什么是栈和队列?什么是单线程和异步?什么是事件环

栈和队列在计算机内存中存取数据,基本的数据结构分为栈和队列。栈(Stack)是一种后进先出的数据结构,有时候也管栈叫做“堆栈”,但是“堆”又是另一种复杂的数据结构,和栈完全是两码事。栈的特点是操作只在一端进行,一般来说,栈的操作只有两种:进栈和出栈。第一个进栈的数据总是最后一个才出来。队列(Queue)和栈类似,但它是先进先出的数据结构,插入数据的操作从队列的一端进行,而删除的操作在另一端。在Ja...

weixin_39751769的博客 155

从时序参数到电压供给:TTL(RGB)液晶屏驱动调试全解析

本文全面解析TTL(RGB)液晶屏驱动调试的关键技术,从时序参数配置到电压供给系统搭建,详细介绍了同步信号参数、寄存器配置技巧以及升压电路设计。通过实战案例和常见故障分析,帮助工程师快速掌握液晶显示屏调试方法,提升开发效率。

weixin_30588675的博客 247

java异步的缺点_Java 异步编程 CompletableFuture

我们已经在之前的文章中了解使用了 Future 接口,但是 Future 方法有它的缺陷, Future 的 get () 方法是一个阻塞调用,它需要等待任务计算完成,然后检索结果进行后需操作,在这之前程序的所有操作都会被阻塞。Future 接口的缺点:无法完成 Future 时我们只能尝试取消任务Future 接口中的 get() 方法是一个阻塞操作Future 不支持异常处理多个 Future...

weixin_32821477的博客 999

LaTeX公式转Word竟这么简单?Python三行代码实现学术论文格式无忧

本文介绍如何利用Python的latex2word库,仅需三行代码即可将LaTeX数学公式精准转换为Word原生Office Math对象,解决学术写作中LaTeX与Word格式割裂的难题。该方法支持批量处理、格式保真,并能与Markdown、Jupyter Notebook等工具集成,构建自动化写作流程,实现学术论文格式无忧。

qsc90123456的博客 296

【QGIS】【OsGeo4w】安装方法

every blog every motto: You will never know unless you try 0. 前言 因为目前要使用QGIS,然而环境配置就整了大半天,哎,进行简单记录,方便自己方便他人。 一共分为两种方式安装: 独立安装包 网络安装包(下载osgeo4w-setup) QGIS提供了不同的版本: 长期发行版(LTR) 最新版(LR) 开发人员版本(DEV,母版或测试版) 说明: 本文推荐第二种 1. 正文 1.1 下载osgeo4w 下载链接 下载完成: 1.2

胡侃有料的博客 2万+

执行栈、event-loop事件循环

执行顺序: javaScript的单线程机制,会执行完所有同步任务,再去执行队列中的任务 相同类型的任务,从上往下执行 不同类型:微队列任务优先级高于宏队列任务 (1)会先执行完所有微队列任务,再去执行宏队列任务 (2)若宏队列中有微队列任务,则会先执行该宏队列任务,然后执行微队列任务,再去执行之后的宏队列 即每次准备取出执行下一个宏队列任务之前,都要将微队列中的任务全部取出来执行 宏队列任务:dom回调、ajax回调、定时器回调 微队列任务:Promise回调、mutationObs

weixin_43294560的博客 963

手把手教你用示波器搞定PCIe 5.0 REFCLK时钟信号测量(附完整参数解读)

本文详细介绍了如何使用示波器进行PCIe 5.0 REFCLK时钟信号测量,包括示波器与探头的选择、关键参数的测量方法及解读,以及实战中的常见问题与解决方案。通过手把手教学和完整参数解读,帮助硬件工程师高效完成时钟信号测量,确保系统稳定性。

weixin_28704565的博客 359

JavaScript异步机制(一)调用栈(call stack)

调用栈(call stack) 代码在运行过程中,会有一个叫做调用栈(call stack)的概念。调用栈是一种栈结构,它用来存储计算机程序执行时其活跃子程序的信息。(比如什么函数正在执行,什么函数正在被这个函数调用等等信息)。调用栈是JS引擎执行程序的一种机制。 程序每调用一层函数(方法),引擎就会生成它的栈帧,栈帧里面保存了函数的执行上下文,然后将它压入调用栈。栈是一个后进先出的结构,直到...

weixin_34227447的博客 1407

【自适应调制】自适应调制解调通信链路误码率matlab仿真与分析

BPSK中的B是“Binary”的意思,也就是有两个变化状态,比如说相位上的“+90°(代表1)、-90°(代表0)”,一个状态代表的就是一个比特。QPSK的“Q”是“Quadrature”的意思,有四个变化状态,如相位上的“+45°(代表00)、-45°(代表11)、+135°(代表10)、-135°(代表01)”,那么一个状态就代表两个比特的信息,如图2所示。同理8PSK的一个状态代表三个比特。但是功率资源并不是无限的,基站总的发射功率是一定的,为了充分利用所有的功率,采用的就是AMC技术。

FPGA/MATLAB学习教程/源码/项目合作开发 1833

QT6实现USB摄像头接入显示与抓拍功能实现

QT实现USB摄像头接入显示 一、UVC协议简介 UVC全称是USB Video Class(USB视频类),是一种标准化的USB视频设备通信协议,它定义了摄像头与主机之间的数据传输协议和格式。 UVC协议的出现,解决了摄像头厂商之间互不兼容,以及摄像头应用开发与平台之间的散乱问题。 UVC标准是由USB-IF主导制定的,目前最新的版本是UVC 1.5,UVC的缺省设置类容易实现,不需要额外的驱动程序。

热土程序园,利他愉己~ 3416

同步异步与执行栈(marksheng背诵简约版)

同步(顺序) 异步(同时) 单线程: 同步异步是一种概念,真正在工作的是线程 CPU(纳秒级计算)主要由三大部分组成:逻辑运算单元(ALU)、寄存器、控制单元 串行(同步) 并发(有前后顺序) 伪同步 并行(同时完成) 异步 主执行栈和任务队列(微任务和宏任务)——事件循环 微任务:process.nextTick、MutationObserver 、Promise。 宏任务:setTimeout、setInterval 、setImmediate 、requestAnimat...

Mark Sheng的博客 248

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 3787

RAG系统混合检索技术解析:从语义理解到关键词匹配的工程实践

在信息检索领域,检索增强生成(RAG)系统已成为连接大语言模型与外部知识库的关键架构。其核心挑战在于如何从海量文档中精准定位相关信息,这直接关系到生成答案的质量与可靠性。传统检索方法主要分为基于语义理解的向量检索和基于关键词匹配的稀疏检索两大范式,二者在原理上形成互补:向量检索通过神经网络将文本映射到高维空间,擅长捕捉语义相似性和同义词泛化;而稀疏检索则依赖词频统计模型,在精确匹配专业术语和实体名称方面表现卓越。从技术价值看,单一检索模型难以应对真实场景中查询意图多样、文档表述复杂的挑战,混合检索通过融合两

weixin_31421613的博客 298

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

技术人的贡献可见性困境与影响力构建

技术影响力本质上是可验证、可传播、可传承的专业信用,其核心不在于技术水平高低,而在于知识转化与社区连接的有效性。当技术贡献因场景隔离、语言壁垒或传播缺位而陷入‘可见性困境’,再深厚的积累也难以形成真实影响力。MVP等认证机制的公信力危机,实则是技术价值评估体系与工程实践脱节的缩影——它暴露了‘分享行为’与‘被消化效果’之间的巨大鸿沟,也揭示了开发者从‘代码实现者’向‘知识炼金师’跃迁的关键路径。本文聚焦技术人如何通过可运行代码、可度量效果、可追溯影响三大基础设施,构建可持续的贡献闭环,适用于所有希望在开源、

天下无双 512

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

js的事件循环(Event loop)、执行上下文、执行栈和事件队列的手记

js是一个单线程非阻塞的脚本语言。 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务。 非阻塞则是当代码需要进行一项异步任务(无法立刻返回结果,需要花一定时间才能返回的任务,如I/O事件)的时候,主线程会挂起(pending)这个任务,然后在异步任务返回结果的时候再根据一定规则去执行相应的回调。 为什么要单线程?因为js是和浏览器交互的,需要操作各种dom, 如果javascript是多线程的,那么当两个线程同时对dom进行一项操作,例如一个向其添加事件,而另一个删除

weixin_46554760的博客 400

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

异步操作的优缺点及其应用场合

我曾经提到异步操作能提高系统的吞吐能力,正确使用异步操作来校正滥用异步的错误做法,那异步究竟有何优点值得我们使用?而又有什么缺点需要我们使用的时候小心呢?诚如老赵所说, 异步并不一定能提高系统性能,甚至因为线程的创建,消亡,和切换会增加系统开销,但异步除了提高性能,还可以增强系统的健壮性。在过去,windows程序总是单线程的,在这样的系统中,如果出现了异常,系统就会 因此而崩溃,甚至连我们的操作

布道 1万+

c++循环执行一个函数_C|从流程图和汇编代码清晰看透递归函数代码的执行流程

先看下面的简单实例:#include int counts(int n){printf("call: %d",n);if(n==0)return n;else{counts(n-1);printf("back: %d",n);return n;}}void main(){printf("%d",counts(3));getchar();}运行结果:call: 3call: 2call: 1call...

weixin_39999536的博客 248

java异步的缺点_两个异步处理AsyncTask和Handler的优缺点

首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTa...

weixin_42388485的博客 659

栈

1.栈 栈是一种后进先出的数据结构。向栈中插入新元素称为进栈、入栈、压栈,使新元素成为栈顶元素;从栈中删除一个元素称为出栈、退栈,于其相邻的元素成为栈顶元素。栈顶指针是指向栈顶元素的标记,通常记为TOP,在数组栈中TOP是一个int型变量,而在链表栈中是一个int*类型指针。数组栈中数组下标从0开始,TOP为栈顶元素的下标。 2.栈的基本操作 以数组栈为例 (1)获取栈内元素个数 int size(){ return TOP+1; } (2)是否为空 TOP=-1表示栈内没有元素 bool empty(

Del Piero的博客 400

JS异步执行机制的理解

说起JS的异步执行机制,如果百度一下,你首先会发现阮一峰的写过一篇关于异步机制的文章(http://www.ruanyifeng.com/blog/2014/10/event-loop.html),等你津津有味又一头雾水的看完,然后继续看百度的其他结果,然后会发现,阮一峰的这篇被另一个大牛朴灵给批判了(http://www.360doc.com/content/14/1011/13/1507765...

4730

JS:事件循环机制、调用栈以及任务队列

写在前面js里的事件循环机制十分有趣。从很多面试题也可以看出来,考察简单的setTimeout也就是考察这个机制的。 在之前,我只是简单地认为由于函数执行很快,setTimeout执行时间即便为0也不会马上输出,而是等待函数执行完后再输出。这只对了一半。 实际上其运行机制就是js中的事件循环机制,在这个循环机制中呢,又与call Stack和task queue有关。我的参考参考了两篇文章,所以

QD的博客 1万+

JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数

前言 在我们学习JavaScript中,我们知道,JavaScript的执行环境是单线程的。所谓单线程是指一次只能完成一个任务,如果有多个任务,就必须排队,只有当前面一个任务完成时,才能执行后面一个任务,以此类推。 这种模式虽然实现起来比较简单,执行环境相对单纯;但是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。 比如下面这段代码示例: let i = 0; while (i < 100000) { console.log(i) i++ } console.log('

zimeng303的博客 849

自执行函数、map循环、call和apply用法

主要描述了自执行函数的几种用法,js沙箱模式,函数的四种调用模式,forEach和map循环,this的指向问题,call和apply的详细应用场景

Apologize 1494

同步和异步是如何执行的

同步任务都在主线程上执行,形成一个执行栈。 回调函数不属于同步任务 异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)

liulang68的博客 565

js中的异步模式--- 回调函数篇

js中的异步 使用像 JavaScript 这样的语言编程时,很重要但常常被误解的一点是,如何表达和控制持续一段时间的程序行为。 如从数据库或文件系统中请求数据然后显示数据、通过网络发送数据并等待响应,或者是在以固定时间间隔执行重复任务(比如动画)等。这些程序并不会以及运行结束,通常一部分运行在当下,另一部分运行在将来。 事实上,程序中现在运行的部分和将来运行的部分之间的关系就是异步编程的核心。...

麦子的博客 4046
上一篇: ES6 普通符号 共享符号 知名(公共、具名)符号
下一篇: ES6 异步处理的通用模型 学习Promise之前一定要理解的部分
苟盛
博客等级 码龄7年 13粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值