事件循环机制-Event-Loop

news2024/11/30 12:27:40

在这里插入图片描述

一:什么是浏览器的事件循环机制?

  • 浏览器的事件循环是指在Web浏览器对事件的处理机制。它是基于异步编程模型,运行在JS的引擎之中

二:浏览器的进程和线程

首先要了解我们所编写的JJS代码最终是怎么在浏览器中执行的

浏览器工作原理(一):浏览器的进程与线程- zhangsai - 博客园

浏览器是一个复杂的应用程序,运行时候通常包含多个进程和多个线程,用于执行不同的任务和管理不同的资源

  • 进程:是操作系统进行资源的分配和调度的基本单位,进程是程序执行的基本实体
  • 线程:是操作系统能够进行运算的最小单位,一个进程中可以并发执行多个线程,每个线程并行执行不同的任务

浏览器的进程和线程

  • 渲染进程负责加载解析和渲染页面内容,每个标签页通常运行在独立的渲染进程中,每个渲染进程都包含多个线程

    • GUI线程:GUI主线程(也称为UI线程)是浏览器中负责处理用户界面操作和渲染的线程。它负责响应用户的交互操作、更新页面的显示等任务
    • JS引擎线程:负责解释执行JS代码,将JS代码转换成可执行指令,并按照指令的顺序进行执行
      • 在浏览器中,JS引擎的线程是单线程,一次只能执行一个任务,在执行JS代码时,用到了异步编程模型,通过事件循环机制处理异步任务,这样可以使得JS可以处理耗时的操作而不阻塞用户界面的相应
    • 事件监听线程:浏览器中负责监听和触发事件的线程。它是浏览器的一部分,用于处理用户输入、网络操作、定时器等事件的触发和相应。
    • 定时器线程负责管理和触发定时器相关的任务,如setTimeout和setInterval
    • 异步http请求线程:当发起AJAX请求时,浏览器会创建一个独立的线程来处理网络请求,该线程负责与服务器进行通信并接收响应
  • 插件进程负责控制网络使用的所有插件

  • GPU进程负责整个浏览器界面的渲染

三:同步和异步

JavaScript中,所有的任务都可以分为

  • 同步任务:同步任务会在GUI线程(主线程)和JS引擎线程中进行执行
    • GUI线程:主要负责页面的渲染,所以不能被长时间的同步代码阻塞
    • JS引擎线程:会阻碍其它任务的执行,包括GUI主线程的执行,如果JS引擎线程上的同步任务多的话,会导致页面的渲染和用户交互被暂时中断
  • 异步任务:异步执行的任务,比如ajax网络请求,setTimeout 定时函数等
    • 定时器线程
    • 异步http请求线程
    • 事件监听线程

三:宏任务和微任务

异步任务又分为宏任务和微任务

  • 宏任务:需要在事件循环中单独执行的任务单元
    • 渲染事件(如绘制页面、重新布局等)
    • 用户交互事件(如鼠标点击、键盘事件等)
    • 定时器事件(如 setTimeoutsetInterval 的回调函数)
    • 网络请求完成、文件读写完成等异步操作的回调函数
  • 微任务:在当前宏任务执行完毕后立即执行的任务单元
    • Promise 的回调函数
    • Object.Observer
    • MutaionObserver的回调函数

image-20230913210116708

四:事件循环机制

js原理之事件循环Event Loop 宏任务与微任务async与await - 知乎

  • 在事件循环中,调用栈和事件队列是两个重要的组成部分
    • 调用栈:当执行到JS代码时候,函数调用会被添加到调用栈中,按照先进后出的顺序执行
    • 任务队列:存储着待执行的异步任务,任务队列分为宏任务队列和微任务队列
      • 宏任务队列:存储着需要在事件循环中单独执行的任务,如定时器回调、事件回调等。
      • 微任务队列:存储着需要在当前宏任务执行完毕后立即执行的任务,如 Promise 的回调函数、MutationObserver 的回调函数等

事件循环流程

    1. 当执行同步代码的时候,函数调用会依次进入到调用栈中执行
    2. 当遇到异步任务时,定时器回调,定时器到期时,回调函数会进入到宏任务队列中等待执行
    3. 任务队列中的任务会等到调用栈为空时候,事件循环会从任务队列取出一个任务加入到调用栈中执行

注意

  • 微任务队列具有更高的优先级,会在下一个宏任务执行之前被处理。所以,当微任务队列不为空时,即使宏任务队列中有待执行的任务,也会先处理微任务队列中的任务。

代码

    console.log(1)
    setTimeout(() =>
    {
      console.log(2)
    }, 0)
    new Promise((resolve, reject) =>
    {
      console.log('new Promise')
      resolve()
    }).then(() =>
    {
      console.log('then')
    })
    console.log(3)

image-20230913211916706

  • 先执行同步代码,将console.log(1)压入调用栈中,执行完毕弹出,输出1
  • 遇到定时器,异步任务,交给定时器线程处理,等定时器到期将回调函数加入到宏任务队列
    • 宏任务队列:console.log(1)
  • new Promise是同步代码,直接执行,输出new Promise
  • 遇到.then异步代码,微任务,加入微任务队列
    • 微任务队列:console.log(‘then’)
  • 执行到console.log(3),同步代码直接执行,输出3
  • 同步代码全部执行完毕后,调用栈为空,要从任务队列中取出任务加入调用栈中
  • 由于微任务优先,所以从微任务队列中取出console.log(‘then’),并执行输出then
  • 再从宏任务队列中取出console.log(2),并执行输出2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【牛客面试必刷TOP101】Day4.BM15删除有序链表中重复的元素-I和BM17二分查找-I

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…

IDEA双击无效打不开

IDEA双击无效,打不开 一、表象: 1、页面快捷键双击无效,打不开idea 2、bin目录下的idea64.exe点击也无效 二、排查 1、idea/bin目录下有个format.bat文件,将文件重命名为format.txt,然后编辑,在最后一…

浅谈C++|STL之map篇

一.map 1.1map概念 简介: map中所有元素都是pairpair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序 本质: . map/multimap属于关联式容器,底层结构是用二叉树实现。 优点: 可以根…

富斯I6刷10通道固件

使用USB转串口模块刷写10通道固件 一、下载固件 1. 十通道英文固件 下载地址: https://github.com/benb0jangles/FlySky-i6-Mod-/tree/master 选择 FlySky-i6-Mod–master \ 10ch Mod i6 Updater \ 10ch_MOD_i6_Programmer_V1 路径下的文件,亲测可用。 2. 原版六通道中…

[Linux]进程间通信--管道

[Linux]进程间通信–管道 文章目录 [Linux]进程间通信--管道进程间通信的目的实现进程间通信的原理匿名管道匿名管道的通信原理系统接口管道特性管道的协同场景管道的大小 命名管道使用指令创建命名管道使用系统调用创建命名管道 进程间通信的目的 数据传输:一个进…

JL-A/41 JL-A/42 JL-A/43 集成电路电流继电器 过负荷或短路 JOSEF约瑟

JL-A、B集成电路电流继电器 JL-A/11 JL-A/31 JL-A/12 JL-A/32 JL-A/13 JL-A/33 JL-A/21 JL-A/22 JL-A/23 JL-A/34 JL-A/35 JL-B/41 JL-A/42 JL-B/43 JL-B/11 JL-B/31 JL-B/12 JL-B/32 JL-B/13 JL-B/33 JL-B/21 JL-B/22 JL-B/23 JL-B/34 JL-B/35 JL-B/41 JL-B/42 …

Android性能优化之应用瘦身(APK瘦身)

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 apk组成 三、优化方向3.1 源代码3.1.1 代码混…

bootstrap-datepicker实现只能选择每一年的某一个月份

1、问题描述 最近碰到一个需求,要求日期控件选择的时候,只能选择某一年的1月份。 2、解决方法 使用setStartDate()和setEndDate()函数对日期选择框进行范围限制。 3、我的代码 【免费】bootstrap-datepicker实现只能选择每一年的某一个月份资源-CSDN文库…

JavaWeb_LeadNews_Day12-jenkins

JavaWeb_LeadNews_Day12-jenkins 后端项目部署多环境配置切换服务集成docker配置父工程项目构建构建微服务部署服务到远程服务器整体思路安装私有仓库jenkins插件部署服务准备工作部署服务 jenkins触发器来源Gitee 后端项目部署 多环境配置切换 在微服务中的bootstrap.yml中新…

Dajngo06_Template模板

Dajngo06_Template模板 6.1 Template模板概述 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术 静态网页:页面上的数据都是写死的,万年不变 动态网页:页面上的数据是从后端动态获取的(后端获取数据库…

二叉树详解(求二叉树的结点个数、深度、第k层的个数、遍历等)

二叉树,是一种特殊的树,特点是树的度小于等于2(树的度是整个树的结点的度的最大值),由于该特性,构建二叉树的结点只有三个成员,结点的值和指向结点左、右子树的指针。 typedef int DateType; t…

长亭雷池社区版本安装与使用

0x01 雷池介绍 一款足够简单、足够好用、足够强的免费 WAF。基于业界领先的语义引擎检测技术,作为反向代理接入,保护你的网站不受黑客攻击。核心检测能力由智能语义分析算法驱动,专为社区而生,不让黑客越雷池半步。 官方网址&…

第一类曲线积分与二重积分在极坐标系下表示的区别

1.第一类曲线积分与二重积分在极坐标系下表示的区别 区别主要来源于一是曲线积分的积分区域为边界,而二重积分的积分区域为内部边界,二是极点位置选取的不同,二者共同造成在积分区域在极坐标下表示的不同,即 ρ \rho ρ是常量还是…

解决谷歌浏览器会http网站自动变成https的问题

不知道是不是升级的缘故,最近打开公司一个http网站,会自动跳去https,用了网上说的这个方案,如下: 但发现还不行,这时我尝试用点击地址栏左边那锁的那个图标,图如下: 然后点击网站设…

Pytest系列-数据驱动@pytest.mark.parametrize(7)

简介 unittest 和 pytest参数化对比: pytest与unittest的一个重要区别就是参数化,unittest框架使用的第三方库ddt来参数化的 而pytest框架: 前置/后置处理函数fixture,它有个参数params专门与request结合使用来传递参数&#x…

【javaSE】 枚举与枚举的使用

文章目录 🎄枚举的背景及定义⚾枚举特性总结: 🌲枚举的使用🚩switch语句🚩常用方法📌示例一📌示例二 🎍枚举优点缺点🌴枚举和反射🚩枚举是否可以通过反射&…

【基本数据结构 三】线性数据结构:栈

学习了数组和链表后,再来看看第三种线性表结构,也就是栈,栈和后边讲的队列一样是一种受限的线性表结构,正是因为其使用有限制,所以对于一些特定的需要操作可控的场合,受限的结构就非常有用。 栈的定义 我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也…

矩阵系统全方位管理多平台1000多个账号,实现精准化运营获客!

全自动化视频综合处理工具! ​ 普通的剪辑软件是不可能实现自动化,一个人一天制作3000条视频!​必须要借助高效率的工具【呆头鹅批量剪辑软件】探店混剪系统,导入大量的素材,就能自动帮你批量处理,满…

第28章_瑞萨MCU零基础入门系列教程之基于面向对象的工程结构

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

Django05_反向解析

Django05_反向解析 5.1 反向解析概述 随着功能的不断扩展,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。这个时候我们可以通过反向解析,将 url解析成对应的 试图函数 通过 path…