【JavaScript】线程和进程,JavaScript线程,事件队列,事件循环 ,微任务、宏任务

news2025/2/21 20:54:36

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • 进程和线程
  • JavaScript线程
    • 事件队列、事件循环
    • 微任务、宏任务
      • 面试题1
      • 面试题2

进程和线程

  • 进程:计算机已经运行的程序,使操作系统管理程序的一种方式
  • 线程:操作系统能够运行运算调度的最小单位,通常情况下被包含在进程中
  • 那么操作系统使如何做到同时让多个进程同时工作的?
    这是因为CPU的运算速度非常快,它可以快速的在多个进程之间迅速的切换;当我们进程中的线程获取到时间片时,就可以快速执行我们编写的代码,对于用于来说是感觉不到的

JavaScript线程

  • JavaScript是单线程的(但是可以开启Workers),但是JavaScript的线程有自己的容器进程:浏览器或者Node
  • 目前多数的浏览器都是多线程的,当我们打开一个tab页面时就会开启一个新的进程,这是为了防止一个页面卡死而造成所有页面无法相应,整个浏览器需要强制退出;
  • 每个进程中又有很多的线程,其中包括执行JavaScript代码的线程,JavaScript代码执行是在一个单独的线程中执行的,这就意味着JavaScript代码在同一时刻只能做一件事,如果这件事是非常耗时的,当前的线程就会被阻塞
  • 所以真正的耗时的操作,实际上并不是由JS线程在执行的,浏览器的每个进程是多线程的,在其他线程可以完成这个耗时的操作,比如网络请求,定时器

事件队列、事件循环

  • 如果我们在执行JS代码中,有异步操作,比如中间插入了一个setTimeout函数时候,这个函数会被放入调用栈中,执行会立即结束,并不会阻塞后续代码的执行,而当所有的代码都执行完毕之后(全局执行上下文调用栈为空时),setTimeout中的回调函数会被浏览器依次放在事件队列中,然后出队列在调用栈中执行
    在这里插入图片描述

微任务、宏任务

  • setTimeout,setInterval,ajax,DOM监听等这种任务是宏任务,浏览器将他们加入到宏任务队列,Promise中then后面的函数是微任务,浏览器将他们加入到微任务队列
  • 这里我们需要保证在执行任何一个宏任务之前,我们必须保证微任务队列是清空的

面试题1

在这里插入图片描述

面试题2

  • 注意,如果有await的话,await后面的函数会立即调用,但是当遇到resolve或者reject的时候,就会调用.then或者.catch,这时候就要先加入到微任务里,等待全局执行上下文都完成后再执行微任务
    在这里插入图片描述

————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

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

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

相关文章

有符号定点小数的31bit问题

背景 定点小数就是小数位恒定的小数,在信号处理等领域应用广泛,它的表示格式类似于S1.7(有符号,整数部分1bit,小数部分7bit)、U0.8(无符号,没有整数部分,小数部分8bit&a…

基于java的班级综合测评管理系统的设计与实现

背景 本系统的主要目的在于加速信息化进程,充分利用计算机技术和现代通讯的手段面向学校的服务。建立信息交流平台,方便信息资源的共享,加强各个部门之间的交流。提高整体的办公效率,为管理员以及教师提供辅助的班级综合测评管理…

Java如何远程调试线上项目

远程调试java项目 [Remote Debug JVM] 一、前提二、配置IntelliJ IDEA2.1、打开 IntelliJ IDEA 并打开您的 Java 项目2.2、单击 "Run" 菜单,然后选择 "Edit Configurations..."2.3、在 "Run/Debug Configurations" 对话框中&#xff…

c++ ffmpeg 开发之配置文件(1)

第一 目录结构 D:\work\c\ffmpeg //项目根目录 D:\work\c\ffmpeg\depend //ffmpeg ffmpeg c开发包点击下载 D:\work\c\ffmpeg\include D:\work\c\ffmpeg\depend\lib D:\work\c\ffmpeg\source //源码根目录 第二:测试源码,名字自己随意起…

AntDB数据库参加开源数据库技术沙龙,分享全栈业务能力

5月12日,由PostgreSQL中文社区和PolarDB开源数据库举办的开源数据库技术沙龙温州站于温州大学举办。此次活动邀请了众多数据库领域的专家和技术大咖,旨在促进数据库与温州产业界和学术界的交融发展与合作,共同探讨数据库产业未来的发展趋势&a…

Java高并发核心编程—CAS与JUC原子类

注:本笔记是阅读《Java高并发核心编程卷2》整理的笔记! CAS原理 JUC原子类一Atomic 基本原子类 数组原子类 引用原子类 字段更新原子类 AtomicInteger 线程安全原理 引用类型原子类 属性更新原子类 ABA问题 提升高并发场景下CAS提作的性能 以空间换时间:…

idea 调试远程docker中的spring boot 项目

开发环境 idea-2023(放心,旧版本也可以远程调试) Java版本:17 生产环境 docker版本:23.0.3 Java版本1:openjdk:17.0.2(基于Java17的项目) Java版本2:adoptopenjdk:…

开源网安亮相粤港澳大湾区CIO高峰论坛,保障企业数字化安全转型

近日,由深圳市工业化与信息化局、深圳市科学技术协会指导,深圳市CIO协会主办的“2023中国(深圳)数字化转型大会暨粤港澳大湾区CIO高峰论坛”圆满完成。开源网安作为拥有软件安全领域全链条产品的厂商,携多年来打造的国产化软件安全替代方案&a…

EMC模式如何助力新能源服务商攻坚克难

01. 什么是合同能源管理? 合同能源管理(EMC-Energy Management Contract)是一种新型的市场化节能机制,其实质就是以减少的能源费用来支付节能项目全部成本的节能投资方式。:节能服务公司与用能单位以契约形式约定节能项目的节能目标,节能服务…

【Python脚本】视频稳像(Video Stabilization)

#【Python脚本】视频稳像(Video Stabilization) 参考:博客1 参考: 原文:https://blog.csdn.net/hjl240/article/details/52683738 开源:关键词 Video Stabilization 不错: https://github.com/yaochih/awesome-vide…

秒杀系统常见问题—如何避免库存超卖?

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 先看问题 首先上一串代码 …

Linux SUID提权脏牛提权

SUID提权 suid就是set user id 。设置了SUID后,文件启动的时候就会以root的权限去运行。就是一个普通用户运行的时候,因为有SUID,所以用root权限去运行它。 加SUID权限chmod ux 这里开始复现。 上传Linux提权信息检测脚本LinEnum find …

堆及其实现

目录 一:堆的概念及结构 1.概念 2.堆的性质 二:堆的实现 1.堆的构建 2.堆的销毁 3.数据的交换 4.堆的插入 5.堆的判空 6.堆的删除 7.取堆顶的数据 8.堆的数据个数 9.示例 三:完整的代码 一&#xff…

十、数据仓库详细介绍(数据质量)理论与经验

数据质量管理是对数据从计划、收集、记录、存储、回收、分析和展示生命周期的每个阶段里可能引发的数据质量问题,进行识别、度量、监控、预警等一系列管理活动,并通过改善和提高组织的管理水平使得数据质量获得进一步提高。数据质量管理的终极目标是通过…

会声会影2023最新完整版免费下载

会声会影2023操作简单,功能同样强大!会声会影附带上百种特效、滤镜、转场、模板。同时各类专业级视频工具,如调色、遮罩、绿幕抠像、运动追踪、分屏创建器,满足更高标准的视频需求。这款软件上手操作简单易学,就算你在…

Linux之进程管理类命令

进程管理类命令 ps:查看当前系统进程状态 1)基本语法 语法说明ps aux查看系统中所有进程ps -ef可以查看父子进程之间的关系 2)选项说明 选项说明a列出带有终端的所有用户的进程x列出当前用户的所有进程,包括没有终端的进程u面…

C语言的一些杂记6

实现矩阵序号转置的三种方式 for (i 0; i < row * col; i)t[i / row][i % row] m[i % row][i / row];for (i 0; i < row; i)for (j 0; j < col; j)t[j][i] m[i][j];for (i 0; i < row; i)for (j 0; j < col; j)*(*(t j) i) *(*(m i) j); 变相数组 …

关于 arduino 中的 map(x, a, b,c,d)函数

函数名称&#xff1a;map() 包含形参&#xff1a; value&#xff1a;需要映射的值fromLow&#xff1a;输入值的最小值fromHigh&#xff1a;输入值的最大值toLow&#xff1a;输出值的最小值toHigh&#xff1a;输出值的最大值 功能&#xff1a;将一个值从一个范围映射到另一个…

【环境安装】Linux环境中docker安装redis

一、找到一个合适的docker的redis的版本 可以去docker hub中去找一下 https://link.juejin.cn/?targethttps%3A%2F%2Fhub.docker.com%2F_%2Fredis%3Ftab%3Dtags 二、使用docker安装redis 我这里安装了具体的某个版本 docker pull redis // 下载最新版Redis镜像 (等同于 : d…

UAS协议说明

1 概述 UAS(USB Attached SCSI)是一种位于SCSI协议框架下传输层的一种协议&#xff0c;其作用是通过基于USB的应用层协议约定&#xff0c;将SCSI的协议数据(Protocol Data Unit)用USB进行封装&#xff0c;从而实现使用USB物理连接进行SCSI协议通信的方式。 UAS实际上定义了两…