JS 事件循环机制、调用栈、堆、主线程、宏任务队列、微任务队列、缓存管理之间的关系

news2024/11/24 10:27:39

一、事件循环机制

你是否想过,在控制台执行代码时,为什么能立即得到响应?
实际上,底层有一套模型机制叫 事件循环,换句话说,它是一个”死循环“,
里面负责监听&执行我们写的 JS 代码,咋们暂且称为一个处理代码的容器。

事件循环负责执行代码,而执行是一套机制存在的,这里借用 MDN 的图:
请添加图片描述
下面我将一一解释每个机制的作用。

二、调用栈与堆

2.1 调用栈

当我们调用一个函数时,这个函数就会进入栈,在图上面则对应一个帧(Frame ),函数执行完后,”帧“便消失:

debugger
const foo = () => {}
foo()

请添加图片描述

我们常看到的”栈溢出“?说的就是”帧“数量太多超出限制了!
所以在执行函数时,尽量少犯这种错误,比如循环、函数递归、定时器、像这些操作都要仔细妥善处理。

2.2 堆

从图中你也看出来了,堆其实放的就是引用类型的数据,换句话说,里面就是一块内存,存放对象数据的。
请添加图片描述

三、主线程

3.1 什么是主线程?

当我们正常地执行一个函数且不加以其它修饰时,这个函数便会被放到主线程里面去执行,比如:

const foo = () => {}
foo();

主线程是按序执行的,假如有大量的函数执行,每个函数都得等前面的函数完全地执行后才能轮到它执行。
这样会存在一个阻塞问题,假设有个请求商品列表函数,响应结果等了 3s,
而函数后正好是获取用户个人头像的函数。

于是,用户的头像至少得等 3s 后才能展示出来,对于用户体验来说是不能忍受的。
换句话说,只要有阻塞行为,那就是不可取的!

为了避免阻塞行为,我们必须得将阻塞的函数放到另一种地方去执行,不能影响主线程。

这种地方就叫做 任务队列

四、宏任务队列

宏任务队列通常有这几种:

  • setTimeout/setInverval 定时器。
  • callback 回调函数。
const foo = () => console.log('Hello, I am Foo')
setTimeout(foo, 10)
const bar = () => console.log('Hello, I am Bar')
bar()
// 打印顺序是:Hello, I am Bar -> Hello I am Foo

强调下,定时器的第二个参数表示执行时间的最小单位,并不会准确的按照指定时间去执行,
也就是说,它是不稳定的,出现不稳定的因素有比如,其它宏任务还未执行或主线任务还没执行完时,
此时的 foo 就不会被调用,或者说也处于“阻塞状态”(但不影响主线程),我们来验证这点:

const now = Date.now()
console.log('当前时间:', now)
const foo = () => console.log('Hello, I am Foo. 当前花费时间(s):', (Date.now() - now) / 1000)
setTimeout(foo, 500)
while(Date.now() - now <= 2000) {}

上面的代码中,定时器指定了 500ms,但实际上过了 500ms 后根本不会立即执行,因为我们主线程还在执行 while 语句呢,换句话说,主线程优先级大于定时器。

五、微任务队列

微任务队列通常有这几种:

  • Promiseasync/awaitqueueMicrotask

微任务和宏任务概率是相同的,都是属于异步操作,但微任务队列的执行优先级大于宏任务,看例子:

Promise.resolve(() => '').then(() => console.log('Hello, p'))
setTimeout(() => console.log('Hello, s'), 0)
console.log('Hello, main')
// 将会打印:
// Hello, main
// Hello, p
// Hello, s

六、总结

  1. JS 底层有一套《事件循环》模型,说白点就是监听并执行开发人员写的 JS 代码。
  2. 执行过程时有这套机制:
    2.1 调用栈:记录函数的调用与销毁过程。
    2.2 堆:一块存放对象的数据内存。
    2.3 代码执行优先级:主线程(同步执行,会阻塞) > 微任务队列(异步执行,不阻塞) > 宏任务队列(异步执行,不阻塞)

七、缓存管理

缓存放到最后讲是因为这部分内容与上面没多大关系,这里仅顺带讲下。

首先,对于底层语言比如 C 来说,声明变量或函数是需要手动分配和释放内存的,
然而,在高级语言比如 JS/PHP/Python 中,这部分操作被自动化了。

这里我们重点关注:内存是如何被自动销毁的?,换句话说,在 JS 中,这些变量的内存垃圾回收机制是怎样的?
在刚开始时,JS 采用的第一种策略叫做 计数法

原理是,当一个变量被引用时加 1,反之减 1,当引用数等于 0 时,这个变量就可以被销毁了,我们来看下例子:

const o = { name: 'Jack'}
const o2 = o // 引用 + 1
const name = o2.name // 引用 + 2

假设 name 变量最终没有被任何地方引用,则引用 --1,o2 没人引用也 --1,最后只剩下 o,发现也没被引用,
于是这几个变量便可全回收掉。

然而这种方式存在一个问题,如果变量之间相互引用,引用值的计算规则就乱套了,来看下例子:

const o = {name: 'Jack', o2: o2} // o 引用了 o2
const o2 = { name: 'John', o: o, } // o2 引用了 o

这像不像 Mysql 或 Java 等其它语言常说的死锁概念?两者僵持不下,为了解决这问题:
JS 采取了一种新的策略叫做:标记-清除法

核心思路是,JS 定期从顶端(windows)全局对象开始从上向下查找是否有这个对象,如果获取不到这个对象,则该对象便可销毁。

从 2012 年开始,标记-清除法 开始被广泛应用,后来许多回收算法也是基于此策略进行改造的。

对于大部分 JS 开发者而言,我们可以不关系垃圾回收机制的,但是呢,知道哪些地方会造成垃圾对我们写代码和调试是有帮助的,就好比日常的丢垃圾一样,如果你不知道回收站在哪里,直接随地一扔的话会被人鄙视的!

小结:垃圾回收机制

  1. 计数法 2012 年前最初用的,后来因为相互引用问题,弃之。
  2. 标记-清除法 2012 年后开始广泛应用,解决 计数法 带来的弊端。

完!

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

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

相关文章

spring+springMVC+mybatis实现的物业管理系统

本系统借用了前辈的页面框架来实现了一个物业管理系统&#xff0c;使用到的主要技术有&#xff1a;SSM框架&#xff0c;MySql 8.0数据库&#xff0c;tomcat 8.0&#xff0c;使用maven进行依赖管理&#xff0c;前端页面使用的是jsp。整个系统分为用户端和管理员端。 用户端功能有…

Vue.js 中的权限控制是什么?如何进行权限控制?

Vue.js 中的权限控制是什么&#xff1f;如何进行权限控制&#xff1f; 在现代 Web 应用程序中&#xff0c;权限控制是一个重要的话题。Vue.js 作为一种现代的前端框架&#xff0c;提供了一些有用的工具和技术来实现权限控制。本文将介绍 Vue.js 中的权限控制的概念、作用以及如…

一文教你认清云渲染的优势和劣势

在当今数字化时代&#xff0c;云渲染作为一项创新的技术方案&#xff0c;正逐渐成为许多行业中的热门话题。与传统的本地渲染相比&#xff0c;云渲染具备许多独特的优势和劣势。本文将深入探讨云渲染的各项特点&#xff0c;帮助您全面了解这一技术&#xff0c;并为您提供有关云…

js+canvas实现劈腿关系图

【我愿称多对一 一对多关系为劈腿关系】 【仓库地址】gitgithub.com:yyccmmkk/rl.git 【显示所有线路细节】 【合并线路】 【合并同一个目标点线路】 【合并同一个出发点线路】 【数据结构】 原始数据只需要提供节点自身id 父点节id&#xff0c;劈腿关系图自动处理 [{id:z…

基于CSDN上海城市开发者社区第一次线下沙龙的筹备经验分享

引言 由于时间较为紧张、邹老师行程安排紧凑等因素影响&#xff0c;结合实际情况&#xff0c;改茶话会为聚餐&#xff0c;所以在举办线下沙龙的时候一定要根据实际情况来斟酌活动形式。本次活动是和哈士奇&#xff0c;哈哥一起筹备&#xff0c;也得到了哈哥的大力支持&#xff…

如何进行物联网开发可以快速完成产品研发?

物联网产品的研发与开发过程&#xff0c;是一个不断探索、创新、实践的过程&#xff0c;需要很长的周期&#xff0c;在这个过程中&#xff0c;项目团队往往需要投入大量的人力、物力和时间。同时&#xff0c;物联网产品研发过程中还涉及到大量的专业技术和知识&#xff0c;需要…

从git上拉取项目

目录 一、前期准备&#xff0c;获取git下载链接 二、idea下载 2.1.打开git下载界面 2.2.进入下载界面 2.3.下载前期配置 2.4.输入账号密码 2.5.下载完成后idea打开 2.6.下载完成后文件目录展示 三、命令行下载 3.1.打开所需要下载的项目路径 3.2.进入黑窗口 …

【算法系列之数组I】leetcode54.螺旋矩阵

704. 二分查找 力扣题目链接 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 输入: nums [-1,0,3,5,9,12], target 9…

【618备战巡礼】“三高”之第一高--如何打造高可用系统 | 京东云技术团队

前言 我们经常会说互联网“三高”&#xff0c;那什么是三高呢&#xff1f;我们常说的三高&#xff0c;高并发、高可用、高性能&#xff0c;这些技术是构建现代互联网应用程序所必需的。对于京东618备战来说&#xff0c;所有的中台系统服务&#xff0c;无疑都是围绕着三高来展开…

一文说清DC-DC BUCK电路(非常详细)

目录 摘要 BUCK原理 DC-DC芯片框图 自举电容 输出电感 输出电容和纹波 损耗 总结 摘要 DC-DC BUCK&#xff0c;是硬件工程师工作中使用频率非常高的电路&#xff0c;可以这么说&#xff0c;只要板子不是迷你型的&#xff0c;十有八九都有DC-DC。因此&#xff0c;对它的…

Win10安装mac虚拟机

参考文章 按照上面的参考文章进行了安装并完成了安装&#xff0c;结合安装过程中遇到的问题&#xff0c;进行一个总结。 要想在win10上安装mac虚拟机&#xff0c;需要准备三样东西&#xff1a; &#xff08;1&#xff09;虚拟机平台&#xff1a;用来装载mac虚拟机 &#xf…

【分布族谱】学生t分布,及其与正态分布、卡方分布的关系

文章目录 简介正态分布与卡方分布用scipy来验证三者关系 简介 1908年&#xff0c;戈塞特在酿酒厂工作&#xff0c;由于酒厂禁止员工发表酿酒相关的研究成果&#xff0c;所以他以Student为笔名发表了有关t分布的研究&#xff0c;故而这个著名的分布被命名为学生分布。 如果有两…

计算机基础--->操作系统(3)【内存管理】

文章目录 内存管理内存管理主要做什么&#xff1f;什么是内存碎片&#xff1f;常见内存管理方式虚拟内存什么是虚拟内存&#xff1f;虚拟内存的作用&#xff1f;没有虚拟内存的问题什么是虚拟地址和物理地址&#xff1f; 分段机制分页机制转址旁路缓存&#xff08;TLB、快表&am…

MySQL唯一约束失效深度剖析

详细情况&#xff1a; 业务反馈&#xff1a;“用int查出来有两条数据&#xff0c;char类型查出来只有一条数据 &#xff0c;这几个字段还是uk的 ”&#xff08;版本MySQL 5.7.25&#xff09; 表结构如下&#xff1a; CREATE TABLE test_table (id bigint(20) NOT NULL AUTO_IN…

构建方便残障人士使用的网站 web enhance the accessibility

文章目录 前言检测网站是否符合残障人士使用window版软件edge浏览器插件版 前端开发为残障人士的通用标准img标签a标签字体与颜色显示或隐藏的元素可交互的元素标记元素类别 总结 前言 网站的构建往往会忽略一群特殊的人群&#xff0c;在某些方便存在障碍的网民&#xff0c;比…

Docker镜像管理

Docker 概述 Docker是什么 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移…

基于状态的维护(CBM)如何推动设备效率提高?

基于状态的维护&#xff08;Condition-Based Maintenance&#xff0c;CBM&#xff09;是一种先进的维护策略&#xff0c;通过实时监测和分析设备的状态数据&#xff0c;预测设备故障并采取相应的维护措施。CBM基于数据驱动的方法&#xff0c;能够提高设备的可用性、降低维修成本…

PDF怎么转成PPT文件免费?分享几个方法!

PDF文件和PPT文件是常见的两类文件&#xff0c;广泛应用于打工人和学生党之间。每种文件格式都有自己的优势&#xff0c;在不同的情况下使用。PDF格式具有出色的浏览效果&#xff0c;能有效保护文档内容免受随意篡改&#xff0c;而且在传输过程中不会出现乱码问题。然而&#x…

Apifox 发请求时如何自动获取Cookie 和 token

介绍 用户登录到网站或 App 是非常常见的的场景&#xff0c;登录成功后一般会返回登录凭证&#xff08;一般为 Cookie 或者 token&#xff09;&#xff0c;后续其它接口发起请求时会携带 Cookie 或者 token 到服务器进行校验。校验通过&#xff0c;则返回相关的数据&#xff0…

【Linux网络编程】应用层HTTP协议篇

应用层 一、应用层1.1、再谈协议1.2、HTTP协议1.2.1、认识URL1.2.2、urlencode和urldecode1.2.3、HTTP协议格式1.2.4、HTTP的方法1.2.5、HTTP的状态码1.2.6、HTTP常见的Header 二、结合代码理解HTTP通信流程 一、应用层 程序员写的一个个解决我们实际问题, 满足我们日常需求的…