首页 > 编程语言 >JavaScript事件循环:一杯咖啡的时间,搞懂主线程都经历了什么?

JavaScript事件循环:一杯咖啡的时间,搞懂主线程都经历了什么?

时间:2024-10-20 14:52:02浏览次数:9  
标签:执行 同步 JavaScript 任务 奶茶 搞懂 setTimeout 程都

我们今天来聊聊 JavaScript 事件循环。虽然这个词听起来很高深,但你可以把它想象成一个奶茶店里排队买奶茶的过程。主线程就像奶茶店的唯一一个店员,任务就是那些排队的订单,而 JavaScript 的事件循环就是这个店员处理订单的工作方式。

先看代码,咱们慢慢聊:

console.log('1: 进店点单(同步任务)'); // 主线程同步任务

setTimeout(() => {
  console.log('2: 奶茶做好了!(宏任务:setTimeout)'); // 异步宏任务
}, 0);

Promise.resolve().then(() => {
  console.log('3: 加料(微任务:Promise.then)'); // 异步微任务
});

console.log('4: 等奶茶期间,看个短视频(同步任务)'); // 主线程同步任务

执行结果:

1: 进店点单(同步任务)
4: 等奶茶期间,看个短视频(同步任务)
3: 加料(微任务:Promise.then)
2: 奶茶做好了!(宏任务:setTimeout)

事件循环 = 一杯奶茶 + 主线程

JavaScript 是单线程的,意思是奶茶店只有一个店员。这个店员一次只能处理一个任务,也就是“同步任务”。如果有异步任务(比如做奶茶需要时间),店员会先继续做其他简单的事情,等到奶茶做好了再回来处理异步任务。

看上面的例子:

  1. 第1步和第4步:这些都是同步任务,类似于你进店点单和等待时刷短视频。这些任务是直接执行的,不需要等。

  2. 第2步setTimeout 是异步的宏任务,类似于奶茶需要煮好珍珠再给你。这个任务会被放到宏任务队列里,等到同步任务完成后再执行。

  3. 第3步Promise.then 是微任务,类似于“加料”。微任务虽然是异步的,但它很重要,总是插队在宏任务前面执行。比如珍珠已经煮好了,但你先让店员加点其他料,这个加料就相当于微任务的执行。


宏任务 vs 微任务:点单和加料的小争斗

  • 宏任务(Macro Task):像 setTimeout 这样的任务,会被放到“宏任务队列”里。它们类似于做一杯完整奶茶的主要步骤。等主线程上的同步任务全部完成后,才会去处理这些宏任务。

  • 微任务(Micro Task):比如 Promise.then 这样的微任务,虽然也是异步的,但它总会优先于宏任务执行。你可以想象,微任务就像奶茶的“小料”,不做完就没法给你奶茶。


事件循环的秘密:一切尽在秩序中

当你执行一段 JavaScript 代码时,事情是这样安排的:

  1. 主线程先执行同步任务:像点奶茶这种同步任务,直接执行。
  2. 微任务插队:如果有微任务,比如加料,它们会在同步任务完成后,宏任务开始前执行。
  3. 宏任务靠后排:宏任务会在所有同步和微任务完成后执行。

在代码示例中:

  • console.log('1: 进店点单')console.log('4: 看短视频') 是同步任务,直接按顺序执行。
  • Promise.then(微任务)在同步任务后执行,但比 setTimeout(宏任务)优先。
  • setTimeout(宏任务)在所有同步和微任务完成后执行。

总结:程序员的"点单"时刻

JavaScript 主线程就像一位疲惫的店员,面对大量订单和复杂要求,但它从不慌乱。它会根据优先级处理所有任务,让我们像喝奶茶一样丝滑流畅地体验页面。

“我点了奶茶,为什么是珍珠先到了?” —— 微任务笑着说:“因为我插队啦!”

这就是事件循环的魅力所在,虽然任务纷繁复杂,但总有一个清晰的执行顺序。掌握了这个顺序,JavaScript 的世界就像奶茶一样甜美可口!

标签:执行,同步,JavaScript,任务,奶茶,搞懂,setTimeout,程都
From: https://blog.csdn.net/qq_44996048/article/details/142988064

相关文章

  • JavaScript 的基础语法和数据类型的概述
    JavaScript是一种广泛使用的编程语言,主要用于Web开发。它拥有简洁的语法和丰富的功能。以下是JavaScript的基础语法和数据类型的概述。基础语法变量声明使用var、let或const关键字声明变量。varname="Alice";letage=25;constpi=3.14;数据类型J......
  • 一个比喻搞懂非对称加密
    【比喻前提】如果我们把用加密秘钥加密一个文件比喻为上锁,把用解密秘钥解密一个文件比喻为用钥匙开锁【比喻内容】那么对于一个敏感文件,对称加密的做法是把这个敏感文件上锁,并把钥匙给接收方。所以此时如果窃听者拿到了钥匙,就也可以阅读这个敏感文件。非对称加密的做法则......
  • javascript输出金字塔
    <script>//首先创造一个空的变量letstr=''letlevel=prompt("输入金字塔的层数")//获取输入的纯数字,其余情况都转化为NaNlevel=parseInt(level)&&Number(level)//判断用户的输入是否合法if(isNaN(level)){alert("金字塔的数......
  • JavaScript中的this指向
    1.函数在调用时,JavaScript会默认给this绑定一个值;2.this的绑定和定义的位置(编写的位置)没有关系;3.this的绑定和调用方式以及调用的位置有关系;4.this是在运行时被绑定的;this的绑定规则规则一:默认绑定在函数独立调用时使用默认绑定,可以理解为函数没有被绑定到某个对象上常见......
  • 一文搞懂MySQL索引
    索引概述介绍索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。优缺点优势劣势提高数据检索的效......
  • popmotion,一款神奇的 JavaScript 开源动画库
    一、Popmotion简介Popmotion是一款强大的JavaScript开源动画库。它具有轻量、灵活且高性能的特点。(一)轻量性它的代码体积较小,不会给项目带来过多的负担。这使得在各种规模的Web应用中都能轻松集成,无论是简单的小型网站还是复杂的大型单页应用。(二)灵活性1.动画类型多样......
  • 一文搞懂模型倍率怎么计算的,以及模型分组倍率原理!
    ......
  • javascript-类型
    1.number使用64位浮点数表示范围+-1.797*10(308次方),+-5*10(-324次方),相当于C++的double整数-2(53次方)2(53次方)十六进制0x开头例0xff八进制0o开头0io377二进制0b开头使用e表示浮点数6.02e231.47e-322.数的计算,在math类中有很多方法。3.没有上溢,下溢。但有无限大无......
  • JavaScript从零学起 —— 数据类型(进阶篇3)
    说明:此文章用作个人学习记录,若有任何问题或建议欢迎大家在评论区讨论文章目录前言对象(Object)1.定义2.对象创建方式2.1使用对象字面量(ObjectLiteral)2.2使用Object()构造函数2.3使用自定义构造函数(ConstructorFunction)2.4工厂函数(FactoryFunction)2.5类(Cl......
  • 挑战1000道javascript手写题之实现Promise.all(9)
    Promise.all介绍Promise.all方法接收一个数组作为参数,这个参数数组的元素也都是promise实例,该方法返回一个promise示例。constp=Promise.all([p1,p2,p3]);p的状态由p1、p2、p3决定,p最后的状态要么是变成fulfilled,要么变成rejected。变成fulfilled:只有当p1、p2、p3......