JS执行机制(同步和异步)

news/2024/9/23 13:28:28 标签: javascript, 开发语言, ecmascript

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。

异步:在做这件事的同时,你还可以去处理其他事

他们的本质区别:这条流水线上各个流程的执行顺序不同。

同步任务

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

异步任务

耗时的还有资源加载放到任务队列中

宏任务:setTimeout setInterval 微->宏(宏任务之前都会先检测微任务队列中有没有微任务,如果有先执行微任务) I/O

宏任务是指在主线程中执行的较大任务,通常包括以下几种:

  • setTimeout(): 定时器任务。
  • setInterval(): 定时重复任务。
  • I/O 操作: 例如文件读取、网络请求等。
  • UI 渲染: 浏览器的渲染任务。
  • script 的执行: 全局代码的执行。

微任务:Promise nextTick then() Promise的构造函数是同步任务,所以Promise.resolve是同步任务先执行,然后将then加入异步队列

微任务是相对较小的异步任务,通常在当前任务执行完毕后立即执行。主要包括:

  • Promise 的 then() 和 catch(): 当 Promise 状态改变时,相关的回调会被放入微任务队列。
  • MutationObserver: 用于监听 DOM 变动的 API。
  • queueMicrotask(): 将函数放入微任务队列。

await后面执行的都被加到了微任务队列里,后面的都是微任务

执行顺序

在 JavaScript 中,事件循环的执行顺序如下:

  1. 执行一个宏任务(例如执行全局代码)。
  2. 执行所有的微任务,直到微任务队列清空。
  3. 渲染 UI 更新(如果有的话)。
  4. 回到步骤 1,继续执行下一个宏任务。
javascript">console.log("Start"); // 宏任务

setTimeout(() => {
  console.log("Timeout"); // 宏任务
}, 0);

Promise.resolve().then(() => {
  console.log("Promise"); // 微任务
});

console.log("End"); // 宏任务

结果:

javascript">Start
End
Promise
Timeout

先执行执行栈中的同步任务,将异步任务放到任务队列中

一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。


事件循环:

由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环( event loop) 。

就是当一段代码进入主线程,然后主线程会抽离异步任务到任务队列,主线程的同步代码执行完以后去读取异步进行操作,然后异步不断有异步,不断出异步,这就是事件循环

执行栈把异步任务外包出去(交给浏览器来处理),在任务队列看到外包做完了,再拿回来

宿主环境

在 JavaScript 中,所谓的"宿主环境"指的是 JavaScript 代码运行的环境或平台。

JavaScript 是一种脚本语言,它需要一个宿主环境来执行。常见的 JavaScript 宿主环境包括:

  1. 浏览器环境:
    1. 浏览器是最常见的 JavaScript 宿主环境。
    2. 浏览器提供了 DOM(文档对象模型)、BOM(浏览器对象模型)等 API,供 JavaScript 代码与浏览器交互。
    3. 常见的浏览器宿主环境包括 Google Chrome、Mozilla Firefox、Safari 等。
  2. Node.js 环境:
    1. Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境。
    2. 它允许 JavaScript 代码在服务器端运行,并提供了文件系统、网络、数据库等 API。
    3. Node.js 环境使 JavaScript 可以用于后端开发、命令行工具、桌面应用程序等场景。
  3. 其他宿主环境:
  •  除了浏览器和 Node.js,JavaScript 也可以在其他环境中运行,如:
  1. IoT 设备 (如 Raspberry Pi)
  2. Apache Cordova (用于构建跨平台移动应用程序)
  3. React Native (用于构建跨平台移动应用程序)
  4. Electron (用于构建桌面应用程序)

不同的宿主环境提供了不同的 API 和功能,这意味着同一段 JavaScript 代码在不同的宿主环境中可能会有不同的行为和结果。开发者需要了解代码将在哪种宿主环境中运行,并编写相应的代码。

总之,宿主环境是 JavaScript 代码运行的平台或环境,它决定了 JavaScript 代码可以访问和使用哪些 API 和功能。了解不同的宿主环境特性是 JavaScript 开发的重要基础。


http://www.niftyadmin.cn/n/5672005.html

相关文章

战神5/战神:诸神黄昏/God of War Ragnarok(容量175GB)百度网盘下载

版本介绍 v1.0.612.4312|容量175GB|官方简体中文|支持键盘.鼠标.手柄|赠单板学习补丁 配置要求 战神5/战神:诸神黄昏/God of War Ragnarok 游戏介绍 不灭的北欧传奇 由Santa Monica Studio出品、Jetpack Interactive负责PC移植的佳作《God of War Ragnark》将带您…

『功能项目』QFrameWork拾取道具UGUI【69】

本章项目成果展示 我们打开上一篇68QFrameWork扔到地上UGUI的项目, 本章要做的事情是实现当物品在地上时,点击物品将对应物品转移到道具栏中 制作一个提示UI界面 添加Button组件设置为点击即将父物体隐藏 拖拽到文件夹中在场景中删除 创建脚本&#xf…

CentOS:稳定的服务器操作系统选择

在当今的IT环境中,选择合适的操作系统对于服务器的稳定性和安全性至关重要。CentOS(Community ENTerprise Operating System)作为一个基于Red Hat Enterprise Linux(RHEL)的开源操作系统,因其稳定性和安全性…

Stable Diffusion4.9一键安装教程SD(AI绘画软件)

**无套路!**文末提供下载方式 Stable Diffusion 是一款革命性的 AI 绘画生成工具,它通过潜在空间扩散模型,将图像生成过程转化为一个逐步去噪的“扩散”过程。 与传统的高维图像空间操作不同,Stable Diffusion 首先将图像压缩到…

Lua中..和...的使用区别

一. .. 的用法 二. ... 的用法 在 Lua 中,... 是一个特殊符号,它用于表示不定数量的参数。当你在函数定义或调用中使用 ... 时,它可以匹配任意数量的参数,并将它们作为列表传递。在您的代码示例中&am…

关于蓝桥杯嵌入式的部分代码规范及解决问题的算法

写在正文之前 在书写代码的时候需要注意代码的规范,不规范的代码运行起来容易出现更多的问题。 同时,在解决一些问题的时候,需要设计一套完整的算法才能完美地解决问题。 不论是代码的规范还是解决问题的算法,都不是一蹴而就的…

二叉树(链式存储)

文章目录 一、树的基础概念二、二叉树2.1 概念 性质2.2 二叉树的存储2.2 二叉树的基本操作手动创建一棵二叉树遍历:前、中、后、层序获取树中节点的个数获取叶子节点的个数获取第K层节点的个数获取二叉树的高度检测值为value的元素是否存在判断一棵树是不是完全二叉…

AI视频生成模型

AI视频生成领域的模型种类繁多,主要分为以下几种常见的模型架构,它们各自擅长不同的任务场景:(今天先挖个坑,后续再来填坑) GAN(Generative Adversarial Networks) 这个之前有介绍过…