当前位置: 首页 > article >正文

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

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,继续执行下一个宏任务。
console.log("Start"); // 宏任务

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

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

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

结果:

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.kler.cn/news/315923.html

相关文章:

  • 深度学习入门:探索神经网络、感知器与损失函数
  • html实现TAB选项卡切换
  • LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略
  • Python之一些列表的练习题
  • Spring Boot入门:构建你的首个Spring Boot应用
  • Mybatis-plus进阶篇(二)
  • 【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)
  • 数据结构 ——— 常见的时间复杂度计算例题(最终篇)
  • Linux驱动开发 ——架构体系
  • 求最大公约数
  • CSS 布局三大样式简单学习
  • 【解密 Kotlin 扩展函数】命名参数和默认值(十三)
  • 【深入Java枚举类:不仅仅是常量的容器】
  • 数据结构——串的模式匹配算法(BF算法和KMP算法)
  • 设计模式-装饰者模式
  • VMware虚拟机经常性卡死,打开运行一段时间后卡死,CPU占比增至100%
  • 电脑网络怎么弄动态ip :步骤详解与优势探讨
  • Tomcat系列漏洞复现
  • AI时代最好的编程语言应该选择谁?
  • vue h5 蓝牙连接 webBluetooth API
  • MySQL 中删除重复的数据并只保留一条
  • C#实现指南:将文件夹与exe合并为一个exe
  • vscode 环境搭建
  • 神经网络修剪实战
  • ubuntu安装docker compose
  • 解决 TortoiseGitPlink Fatal Error:深入解析
  • JS巧用.padStart()|.padEnd()方法用另一个字符串填充当前字符串
  • 9月16日笔记
  • 工作笔记:Vue 3 中使用 vue-router 进行导航与监听路由变化
  • 关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法