浏览器事件循环机制

浏览器 - 事件循环机制详解 浏览器进程模型,渲染主线程,事件循环 阅读详情

日常开发我们通常都会用到回调函数,promise,setTimeout,我们有没有想过它们在浏览器中是怎样运行的,下面我们通过一个小例子来了解下

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');

执行结果:

script start

script end

promise1

promise2

setTimeout

你的答案和浏览器打印出来的结果是一致的吗?

JavaScript是单线程语言,它只有一个调用栈,同一时刻只能做一件事,例如下面的代码

function mutltiply(a,b) {
    retrun a * b;
}
function square(n) {
    return mutltiply(n,n);
}
function printSqaure(n) {
    var squared = square(n);
    console.log(squared)
}
printSqaure(4);

main()、printSqaure(4)、square(n)、mutltiply(n,n)依次入栈

mutltiply(n,n)、square(n)、printSqaure(4)、main()依次出栈

最终控制台会输出最终结果:8

浏览器执行JavaScript时,事件循环可以保证这个线程可以独立运行,事件循环不断处理任务队列中的任务。所有任务分为同步任务和异步任务两种,同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程,进入任务队列(Event Queue)的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

  1. 所有同步任务都在主线程上执行,形成一个执行栈。

  2. 主线程之外存在一个任务队列,只要异步任务有了运行结果,就会在任务队列之中放置一个事件

  3. 一旦执行栈中的所有同步任务执行完毕了,系统就会读取任务队列,对应的异步任务会结束等待状态,进入执行栈,开始执行。

  4. 主线程不断重复上面的第三步

在这里插入图片描述

任务队列中的任务分为宏任务和微任务,宏任务一般是整体代码script,setTimeout,setInterval,微任务包含Promise。

每执行完一个宏任务,会执行完所有的微任务,执行完之后才会执行下一个宏任务

在这里插入图片描述

既然已经了解到这里了,那么我们可以回头看第一段代码,验证下上面的这些内容

  1. 遇到console.log(‘script start’);整体代码script作为宏任务压入执行栈,浏览器打印script start

  2. 遇到setTimeout,回调函数作为宏任务放入任务队列

  3. 遇到promise,回调函数作为微任务放入任务队列

  4. 遇到console.log(‘script end’);浏览器打印script end

  5. 整体代码(一个宏任务)执行完毕,开始执行微任务,浏览器打印promise1

  6. promise回调函数返回undefined,下一个回调函数作为微任务放入任务队列

  7. 执行下一个微任务,浏览器打印promise2

  8. 执行下一个宏任务setTimeout

    最终输出结果为:

    script start

    script end

    promise1

    promise2

    setTimeout

js浏览器事件循环机制 浏览器事件循环(Event Loop)是处理异步任务和事件的机制,它确保JavaScript代码在执行时不会阻塞用户界面的响应。事件循环在JavaScript的单线程环境中至关重要,因为JavaScript是单线程的,意味着它一次只能执行一个任务。 阅读详情

相关推荐

浏览器渲染原理深度解析(浏览器的事件循环机制)(三)

本文深入解析了浏览器的事件循环机制和渲染原理。首先介绍了浏览器的进程模型,包括浏览器进程、网络进程和渲染进程的分工。重点讲解了渲染主线程通过事件循环处理任务的过程,即不断检查消息队列并执行任务。随后详细剖析了"一帧16.67ms"内浏览器的工作流程,包括宏任务执行、微任务清空、UI渲染和空闲时间调度的优先级顺序,并总结了"宏任务->微任务->rAF->渲染->rIC"的核心关系。最后结合Vue和React的异步更新机制,说明框架如何利用事件循环

m0_43519765的博客 2016

浏览器的事件循环机制

一、事件循环 要想在线程运行过程中,能接收并执行新的任务,就需要采用事件循环机制,如果需要接收其他进程发送来的任务需要引入消息队列 渲染进程的主线程和子线程之间是子线程将任务添加到消息队列。 其他进程发送来的任务是渲染进程的I/O线程接收其他进程的消息,然后添加到消息队列,由主线程的事件循环系统执行。 消息队列机制并不是太灵活,为了适应效率和实时性,引入了微任务。 消息队列的内容为宏任务,每一个宏任务都会有一个自己的微任务队列,执行完一个宏任务之后不会马上去执行下一个宏任务,而且是查看微任务队列中是否有要执

weixin_42440314的博客 6122

python课程教学大纲-《Python语言基础》课程教学大纲

《Python语言基础》课程教学大纲课程名称:Python语言基础课程类别:专业选修课适用专业:电子信息工程考核方式:考查总学时、学分:32学时1.5学分其中讲授16学时,实验10学时,其他6学时一、课程性质、教学目标使学生在全面了解Python技术历史、现状与发展趋势的基础上,系统掌握Python基本概念、编程思想以及程序设计技术,具备熟练的Python编程技能和面向对象软件设计技术思想,完成本...

weixin_37988176的博客 3720

浏览器事件循环(事件轮询)

浏览器事件循环(Browser Event Loop)是浏览器用于处理用户输入、网络请求、渲染和其他异步事件的机制。同步,微任务,宏任务等按事件循环机制顺序进行。

前端工作学习中 3142

中孚保密检查系统彻底卸载指南:绕过口令与清除内核残留

中孚保密检查系统是深度集成于Windows内核的合规管控软件,其卸载涉及用户态口令校验、内核态服务引擎与Ring 0级驱动自保三重机制。理解其基于SHA-256哈希的本地口令验证原理和zfsysflt.sys过滤驱动的加载逻辑,是实现无残留清理的技术前提。该系统具备高权限驻留特性,常规卸载工具无法触达驱动与服务层,易引发蓝屏、启动缓慢及新安全软件冲突等工程问题。典型应用场景包括涉密终端批量清退、安全研究环境重建及误装后紧急退出。本文聚焦‘口令绕过+手动清理’双轨方案,覆盖注册表、服务、驱动、文件与计划任务五

weixin_33508411的博客 966

加湿器方案-DLT8M04TS-杰力科创

基本组成: 一个触摸按键、一组RGB灯、一个雾化片、一个充电IC。 产品功能: 第一次上电光机状态,RGB红/绿/红灯依次闪烁灭; 2、按键功能:短按开关机和三档喷雾工作模式,第一次短按持续喷雾,短按第二次喷3S,停3S,短按第三次关闭喷雾模式,依次循环; 在喷雾或是不喷雾的状态下长按1.5S RGB灯渐变,一直循环,第二次长按当前灯光闪烁一下常亮,第三次长按关机; 3、持续喷雾定时5小时自动断电,间歇喷雾定时10小时自动断电,若在间歇工作时有切换为持续喷雾,那间歇喷雾的...

JLKCsz的博客 512

浏览器事件循环

浏览器事件循环

叮当的猫猫的博客 2284

Tessent实战:网表扫描链插入全流程解析

本文详细解析了使用Tessent工具为网表插入扫描链(Scan Chain)的全流程。从前期环境配置、网表检查,到扫描链数量、时钟域等核心配置,再到执行扫描单元替换与连接,最后进行结果验证与文件输出。文章提供了关键命令与实用技巧,帮助工程师高效完成DFT设计,确保芯片可测试性。

hhh00的博客 744

深入解析浏览器中的事件循环机制

事件循环是JavaScript的执行模型,它控制着JavaScript代码的执行顺序任务的调度以及UI的渲染。JavaScript是单线程的,也就是说,JavaScript的代码只能按顺序在一个线程中逐一执行。为了避免因为长时间执行同步代码导致页面卡顿,JavaScript引入了异步机制。通过事件循环,浏览器能够管理多个异步任务,并保持UI的响应性。

weixin_63726940的博客 736

【ESP32设备通信】-两个ESP32间UART通信

在本文中,我们将使用 Arduino IDE 的 UART 硬件库在两个 ESP32 板之间执行 UART 或串行通信。 要使用 USB 端口调试和编程 ESP32,需要使用称为通用异步接收器/发送器 (UART) 通信的串行端口。 对于大多数传感器和系统,主要的通信方法被认为是 UART。 为了共享工作负载、信息和执行不同的任务,有时需要在两个 ESP32 开发板之间进行通信。

视觉与物联智能 2992

YOLOv13有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

《YOLOv13改进专栏重磅更新》推出500+创新改进方案,涵盖卷积、主干网络、注意力机制、检测头等核心模块优化。专栏提供完整项目代码及答疑服务,包含YOLOv13网络结构解析、环境配置、模型训练全流程指导。内容分为八大模块:卷积优化、注意力机制、细节涨点、主干网络改进、特征融合、检测头优化、小目标检测及Mamba联合改进等,支持多种创新点组合应用,助力科研论文发表。现开放限时订阅,提供试读章节和详细技术解析。

Ai缝合怪、助力小伙伴高效发论文 3372

聊聊浏览器的事件循环机制

最近阅读了一些与浏览器事件循环相关的资料,并整理输出了本篇文章,希望能帮助大家搞懂浏览器的事件循环。后续(会很久,因为我懒)会继续补充node中的事件循环机制。文章将从三个部分介绍事件循...

狗子的博客 607

10种电阻综合对比——《器件手册--电阻》

可变电阻在电子设备中也有很多用途,如在收音机的音量调节电路中,通过旋转可变电阻的旋钮来改变电路中的电阻值,从而改变通过扬声器的电流,实现音量的调节。根据电阻定律,电阻R = ρ(L/S),其中ρ是导体材料的电阻率,L是导体的长度,S是导体的横截面积。比如,同样材料制成的两根电线,粗的电线电阻比细的电线电阻小,长的电线电阻比短的电线电阻大。电流采样电阻的工作原理基于欧姆定律,即电阻两端的电压与通过电阻的电流成正比,公式为 I = V/R,其中 I是电流,V是电阻两端的电压,R 是电阻值。

XU157303764的博客 3138

详解事件循环与浏览器渲染机制

摘要:浏览器采用多进程架构,渲染主线程通过事件循环机制处理HTML解析、样式计算、布局等任务。异步机制避免主线程阻塞,任务按优先级在微队列、交互队列等不同队列中调度。JS执行会阻碍渲染,因其与渲染任务共享主线程。渲染流程包含解析、样式计算、布局、分层等阶段,最终由合成线程和GPU完成绘制。transform效率高因其仅影响合成阶段,不涉及主线程。reflow是布局重计算,repaint是绘制指令更新,两者均影响性能。

2303_80556719的博客 1076

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JS浏览器事件循环机制

进程、线程 进程是系统分配的独立资源,是 CPU 资源分配的基本单位,进程是由一个或者多个线程组成的。 线程是进程的执行流,是CPU调度和分派的基本单位,同个进程之中的多个线程之间是共享该进程的资源的。 浏览器内核 浏览器是多进程的,浏览器每一个 tab 标签都代表一个独立的进程(也不一定,因为多个空白 tab 标签会合并成一个进程),浏览器内核(浏览器渲染进程)属于浏览器多进程中的一种。 浏览器内核有多种线程在工作。 GUI 渲染线程: 负责渲染页面,解析 HTML,CSS 构成 DOM 树等,当页面重绘

Jonathan的博客 2379

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

详解浏览器和Node的事件循环机制及区别

关于事件循环机制浏览器的事件循环机制 浏览器的事件循环机制

fish_skyyyy的博客 2925

一文看懂浏览器的事件循环机制

本文深入解析了浏览器的事件循环机制,从进程和线程的基本概念入手,详细介绍了浏览器多进程多线程的架构。重点阐述了渲染主线程作为单线程的工作原理,包括其任务调度方式、消息队列机制以及异步任务处理原理。文章还分析了W3C规范中的任务队列优先级模型,对比了不同队列类型(如微队列、交互队列、延时队列等)的执行顺序,澄清了常见面试中对"宏任务/微任务"的误解。通过系统梳理事件循环的工作流程,帮助读者建立对浏览器运行机制更准确的认识。

Colorful9的博客 1436

JS关于浏览器的渲染机制和事件循环机制的讲解

渲染机制是一个从代码到像素的流水线解析 -> 构建树 -> 布局 -> 绘制 -> 合成。理解它有助于你写出高性能、避免卡顿的页面。事件循环是 JavaScript管理异步任务的心脏。它通过调用栈Web API和回调队列的协作,让单线程的 JS 能够流畅地处理各种复杂的任务。理解宏任务和微任务的区别是深入掌握异步编程的关键。

chaoxxggg的博客 1202
上一篇: vue+iview实现表格选中记忆+前端导出功能
下一篇: vant-ui uploader上传文件,修改文件名
codezha
博客等级 码龄10年 28粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值