JS单线程的理解

这篇具有很好参考价值的文章主要介绍了JS单线程的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、首先需要区分几个概念:

1. 进程和线程的概念:

  进程:指在系统中运行的一个应用程序,目的就是担当分配系统资源(CPU时间、内存等)的基本单位

  线程:系统分配处理器时间资源的基本单元,建立在进程的基础上,一个进程至少要有一个线程。

2. 浏览器是多进程,多线程的,而JS是单线程的:

  打开一个浏览器Tab页签,会同时创建多个进程,主进程、网络进程、渲染进程、GPU进程...;

  而浏览器的内核就运行在渲染进程中,渲染进程会同时创建GUI渲染线程、JS引擎线程、事件触发线程、定时器触发线程、异步HTTP请求线程

  其中JS引擎进程就是我们常说的JS是单线程的概念。

 

二、同步任务和异步任务

  同步任务:在主程序上按顺序执行的任务就叫做同步任务,只有上一个任务执行完毕后,才会执行下一个任务

  异步任务:未进入主程序,被放置在一个叫做任务队列中的程序中,常见的有回调函数中或者定时器中的任务。

  首先程序会去执行同步任务,同步任务全部执行完毕则去任务队列检查是否存在异步任务;

  注:如果执行中遇到定时器或者延时器,会启动定时线程进行计时监控,如果倒计时为0,则将回调函数中的任务塞

    入到异步队列当作宏任务执行,不是在一开始就塞入任务队列中

 

三、宏任务和微任务

  除了可以分为同步任务和异步任务外,为了更好的理解执行流程,还可以细化为宏任务和微任务;

  宏任务包含:主代码、setTimeout、setInterval、setImmediate、i/o操作(输入输出,比如读取文件操作、网络请求)、

           ui render(dom渲染,即更改代码重新渲染dom的过程)、异步ajax等

  微任务包含:Promise(then、catch、finally)、process.nextTick、Object.observe(⽤来实时监测js中对象的变化)、

        MutationObserver(监听DOM树的变化)

  注:new Promise(() => { ****})中的任务是宏任务、同步任务,只有.then\.finally\.catch中的任务才是微任务、异步任务

    引擎在执行程序的顺序是宏任务-->微任务-->GUI渲染任务-->宏任务....;

  启动执行程序,JS引擎会把整个JS当作宏任务进入主程序开始执行,宏任务执行完成后,会去查看是否存在微任务并执行完毕,然后继续执行宏任务,

  由于主程序不知道是否存在微任务,所以每次宏任务执行完毕后都会去检查是否存在微任务,这种周而复始的过程就叫做事件循环。

 

四、示例说明

 1 console.log(1);
 2 var timeout1 = setTimeout(() => {
 3   console.log(2);
 4   new Promise((resolve) => {
 5     console.log(3);
 6     resolve();
 7   }).then(() => {
 8     console.log(4);
 9   })
10 })
11 
12 new Promise((resolve) => {
13   console.log(5);
14   resolve();
15 }).then(() => {
16   console.log(6);
17 })
18 
19 var timeout2 = setTimeout(() => {
20   console.log(7);
21   new Promise((resolve) => {
22     console.log(8);
23     resolve();
24   }).then(() => {
25     console.log(9);
26   })
27 })
28 console.log(10);

打印结果为:1  5  10  6  2  3  4  7  8  9;

 

过程详解:

1. 首先顺序执行第1行打印结果为:1;

2. 执行2-10行为异步任务,启动定时进程进行倒计时,但是不会立即添加异步任务到任务队列中

3. 执行12-17行,按照上文备注promise()中的方法是宏任务所以会顺序执行,同时打印出5, 其中.then是异步任务所以会添加到任务队列的微任务中.

4. 执行19-27行与第二步类似,启动定时进程进行倒计时

5. 执行28行打印结果为:10

6. 宏任务全部执行完毕后就会去任务队列中检查是否存在微任务并执行,打印结果为:6

7. 倒计时16ms左右结束时,按照代码的先后顺序首先将timeout1中的异步任务添加到任务队列

8. 将timeout1中的任务添加到主程序当作一个宏任务开始执行所以打印结果是:2, 3;然后将.then中的任务添加到微任务中,

  每个宏任务后都会执行一个事件循环检查,然后开始执行微任务,最终打印结果为:2,3,4

9. timeout2会重复执行7、8两步,打印结果为7,8,9文章来源地址https://www.toymoban.com/news/detail-445784.html

到了这里,关于JS单线程的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS单线程的理解

    一、首先需要区分几个概念: 1. 进程和线程的概念: 进程:指在系统中运行的一个应用程序,目的就是担当分配系统资源(CPU时间、内存等)的基本单位 线程:系统分配处理器时间资源的基本单元,建立在进程的基础上,一个进程至少要有一个线程。 2. 浏览器是多进程,

    2024年02月05日
    浏览(23)
  • JS面试题:说一下js单线程的理解?

        js是单线程的,内部要处理的任务分同步任务、异步任务     异步任务分微任务、宏任务     执行顺序:【又称 事件循环机制 】     先执行同步任务,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中。当所有同步任

    2024年01月25日
    浏览(33)
  • 点积、内积、外积、叉积、张量积——概念区分

    找 张量积 概念的时候,被各种野路子博客引入的各种“积”搞混了,下面仅以Wikipedia为标准记录各种积的概念。 https://en.wikipedia.org/wiki/Dot_product 在数学中,点积(Dot product)或标量积(scalar product)是一种代数运算,它取两个 相等长度的数字序列 (通常是坐标向量),并返回一个数

    2024年02月05日
    浏览(48)
  • FPGA中一些基本概念原理的区分

    在 Verilog 中,wire 和 reg 是两种不同类型的变量,它们有着不同的特性和用途 wire 变量用于连接模块中的输入、输出以及内部信号线。 它主要用于表示连续赋值的逻辑连接,类似于硬件电路中的导线。 wire 变量不能在 always 块或 initial 块中赋值,它们只能通过连续赋值“assig

    2024年02月21日
    浏览(39)
  • 图论中回路与圈的概念区分

    第一种定义方法 迹 是边不重复的通路,但是顶点可以重复。 回路 是首尾顶点相同的迹。 路 是顶点不重复的迹,即边和顶点都不重复的通路,但是首尾顶点可以相同。 圈 是首尾顶点相同的路。 第二种定义方法 回路:起点终点相同 简单通路:起点到终点所经过的 边不同 

    2024年02月04日
    浏览(45)
  • JS中如何区分变量是数组还是对象

    这里提供三种方法: 先了解一些概念: 对象的查询属性的两种方法: 1: obj.name 2: obj[\\\'name\\\'] 对象的枚举: 对象枚举共有四个重要的方法 for in 用法 hasOwnProperty用法 打印结果:          你会发现打印出来的东西里面既然会有  原型上的属性 ,本来这个 原型上的属性 你

    2024年02月12日
    浏览(41)
  • Deepface使用时需要的几个模型下载地址

    使用deepface进行人脸属性识别时,需要用到以下模型 https://github.com/serengil/deepface_models/releases/download/v1.0/vgg_face_weights.h5 https://github.com/serengil/deepface_models/releases/download/v1.0/facial_expression_model_weights.h5 https://github.com/serengil/deepface_models/releases/download/v1.0/age_model_weights.h5 https://github

    2024年02月15日
    浏览(33)
  • 这几个方面需要注意,减少服务器被入侵

    网络时代,服务器和计算机不时地遭受入侵和攻击,给人们带来了无法预料的重大损失。诸如服务器入侵、数据盗窃和勒索软件等事件频繁发生,这令许多企业和游戏开发团队备受困扰。通过总结经验和吸取教训,我们必须汲取教益,认识到网络病毒和黑客无处不在,因此我

    2024年04月15日
    浏览(62)
  • 对于晶振电路,我们需要从几个方面考虑设计:

    对于晶振电路,我们需要从几个方面考虑设计:  降低寄生电容的不确定性  降低温度的不确定性  减少对其他电路的干扰 设计注意点: 1. 晶振尽量靠近芯片,保证线路尽量短,防止线路过长导致串扰以及寄生电容。 2. 晶振周围打地孔做包地处理。 3. 晶振底部不要走信号线

    2023年04月22日
    浏览(45)
  • Docker几个概念

    Docker几个概念,有不正确地方欢迎指正 一、首先来看一句话:没有Cgroups就没有LXC,没有LXC就没有Docker。 1、什么是Cgroup呢?Cgroup又名Control group,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(CPU、 Memory、IO、NET)的机制。 可以看出来,Cgroup是Linux内核

    2023年04月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包