事件循环(也叫事件环,也叫event loop)--任务队列(等待执行的任务)--渲染三者的关系

2023-09-21 11:46:02

关键词:阻塞,主线程,事件环(event loop)、任务环(任务队列)、单线程、

本视频总结:
超级复杂的JS底层事件循环事件队列的关系。宏任务、微任务raf回调这3个事件队列的关系。任务队列和执行栈的关系。dom点击事件js调用函数对执行栈的不同影响。事件循环dom渲染之家raf回调函数的执行。附带要理解函数调用过程词法环境和执行上下文。

弹幕上说碳酸饮料对课程没有关系,其实他是在类比举例。可以这么理解,浏览器维护了一个队列,里面放着一大群喝碳酸水的人(task),这些人很古怪,需要尽量减少和他们打交道(微任务难以控制,所以后面推荐用requestAnimation去代替setTimeout)。
至于后面那个高层就是纯粹活跃气氛了,这么看应该能理解他为什么举例喝碳酸水了。我感觉这就是文化差异吧,可能咱们这么演讲的太少了。顺便一提,他之前说他

女朋友提醒他还有几天去新加坡时也是一个类比,和setTimeout差不多一个样子

javascript --》 浏览器 --》 事件环

一、事件环跟任务队列

1、什么是事件环(event loop)??

在程序执行的过程中都有主线程,允许有其他的线程进入,比如网页(浏览器),一旦这些线程需要页面响应操作,需要通知主线程,就需要事件环来协调工作。

2、那必须先解释什么是主线程??

主线程 – 有大量的事情发生 1、javascript 发生的地方。 2、渲染发生的地方。 3、DOM存放的地方。
这也说明网页上大部分活动都具有确定的顺序,我们不会同时运行多段代码去修改同一处DOM

2.1 人们会什么不会思考单线程?

作为人类,我们并没有主线程,而人类就是多线程的。

人 ( 醒着 )的时候是— 多线程, 可以说话,看,听,脚动

人 ( 睡觉 )的时候是— 单线程,看不见,听不到,只是在睡觉

在程序执行的过程中都有主线程,允许有其他的线程进入,比如网页(浏览器),一旦这些线程需要页面响应操作,需要通知主线程,就需要事件环来协调工作。

2.2 任务队列,也是任务环中最重要的一部分。

setTimeout(() => {
如果页面中所有内容都放在延时器中,会阻塞页面执行
}, 5000)

setTimeout(() => {
console.log(‘时间到了,开始执行!!!’)
}, 5000)
如果页面中所有内容都放在延时器(以外),页面就会正常执行,将延时器添加到任务队列中,当到5s时间的时候,会打开与主线程的开关,执行。

3、事件环正常运行时

在这里插入图片描述

4、事件环中有任务队列时

任务队列:嘿,我有个任务交给你
主线程:
任务循环中首先要关注的 TASK Queues,先有事件环,然后
浏览器:有新的事件会通知到事件环
事件环说:已经将它放在待办列表,稍后就会执行,

如下两个setTimeout,事件环应该怎么执行。

	setTimeout(() => {
		console.log('111111')
	}, 1000)
	setTimeout(() => {
		console.log('22222')
	}, 1000)

在这里插入图片描述
事件环中添加任务队列(如上图)
在这里插入图片描述
进入任务队列,开始执行第一个setTimeout

在这里插入图片描述
开始执行任务队列中的第二个setTimeout,执行完之后关闭任务队列的通道

事件环、任务队列的内容就分享完了,如果不是很懂,那就研究 Promise吧

点击跳转promise文章地址

二、事件环、任务队列、渲染就变的复杂了

当考虑到渲染时就变的复杂了

布局树、绘制图层
s: 收集所有的css
l: 布局是创建一个渲染树,找出页面上所有内容
p: 元素的位置

在这里插入图片描述

在javascript中执行以下代码:

	setTimeout(() => {
		while(true)
	})

当遇到死循环后,事件循环卡在了任务队列,需要等这个任务执行完之后,再绘制页面

在这里插入图片描述

当事件环在死循环的过程中,用户点击按钮,复制文字,都会将这一系列事件放在任务队列中,等待事件循环执行完成死循环在继续执行

在这里插入图片描述

Promise.resolve()
  .then(() => {
    console.log(1);
    Promise.resolve()
      .then(() => console.log(3))
      .then(() => console.log(4));
  })
  .then(() => console.log(2));
//上面代码打印出来的顺序是: 1 3 2 4。为什么是这样?一直没搞懂。

以上图解就是 while为什么会阻止渲染和其他页面交互,这其实是一件好事

比如同样是动画,用 animation 执行,就是匀速的

而使用 settimeout执行,就是闪动走的, 因为页面渲染跟 HZ(屏幕刷新率)有关,假设为 60HZ,那么 settimeout(() => {}, 1000 / 60),就是当屏幕刚好刷新时,会记录下闪动的位置。

更多推荐

【Linux is not Unix】Linux前言

目录二战军工的产物——第一台现代电子数字计算机ENIAC(埃尼阿克)UnixLinuxLinux企业应用现状如今计算机已经应用在我们生活的各个层面,像我们日常使用的笔记本是计算机的一类,可以解决我们生活中遇到的很多问题,我们只是进行简单的操作就可以运行我们的计算机得到我们的答案的这其中的操作究竟有什么奥秘?这还得从计算

jvm-sandbox-repeater时间mock插件设计与实现

一、背景jvm-sandbox-repeater实现了基础的录制回放流程编排,并简单的给了几个插件的demo,离实际项目运用其实还需要二次开发很多东西,其中时间mock能力是一个非常基础的能力,业务代码里经常需要用到这块;二、调研2.1如何mock当前时间我们mock的主要是"当前时间",java里获取当前时间的主要方

【CSS】font-weight设置为500显示不出加粗效果

问题出在操作系统上:macOS系统默认的华文黑体(STHeiti)有七个矢量级别:Heavy/Bold/MediumP4/Regular/Thin/Light/UltraLightP2,它包含上面CSS中设定的500这个精度。Windows系统默认的宋体(simsun)没有那么多级别。在缺少级别支持的前提下,CSS会根

【笔记】简单算法查找、排序的思路和优化

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、二分查找1、思路2、初步代码复现3、整数溢出的情况如图:中间索引上的值+右边界索引上的值会造成`

成为绝地求生高手的秘密武器,精准作图、库存查询与封禁防护一网打尽!

想要在绝地求生中成为巅峰玩家,除了优秀的游戏技巧和战斗意识外,还需要掌握一些绝密武器,帮助你科学作图、查询库存,甚至保护账号不被骗和封禁。下面就为你揭秘,让你轻松提升战斗力,引领游戏潮流!首先,作图工具是每个高手必备的利器之一。我们网站提供一系列方便作图的工具推荐,可以轻松绘制战术图和战场布局,帮助你与队友默契配合,制

MiniGPT-4:用高级大型语言模型增强视觉-语言理解

文章目录摘要1、简介2、相关工作3、方法3.1、第一个预训练阶段3.2、策划高质量的视觉语言域对齐数据集。3.3、第二阶段微调4、演示:5、局限性摘要论文链接:https://arxiv.org/pdf/2304.10592v1.pdf最近的GPT-4展示了非凡的多模态能力,例如从手写文本直接生成网站和识别图像中的幽默

JS 手写call、apply和bind方法

手写call、apply和bind方法一、方法介绍1.1call方法1.2apply方法1.3bind二、方法的实现2.1call方法2.2apply方法2.3bind方法一、方法介绍apply、call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply、call和bind都实现在了

软件设计模式系列之十一——装饰模式

当谈到设计软件系统时,经常需要考虑如何使系统更加灵活、可扩展和易维护。设计模式是一种被广泛采用的方法,用于解决常见的设计问题,并提供了一套可重用的解决方案。装饰模式(DecoratorPattern)是一种结构型设计模式,它允许您在不改变对象接口的情况下动态地添加对象的功能或责任。在本文中,我们将深入探讨装饰模式,包括

ChatGLM P-Tuningv2微调定制AI大模型

前言什么是模型微调想象一下,你正在学习如何弹奏一首钢琴曲目。你已经学会了一些基本的钢琴技巧,但你想要更进一步,尝试演奏一首特定的曲目。这时,你会选择一首你感兴趣的曲目,并开始深度练习。Fine-tuning(微调)在机器学习中也是类似的概念。当我们使用预先训练好的模型(预训练Pre-training)来解决一个特定的任

【uniapp】小程序开发:2 安装uni-ui组件库、使用pinia状态管理、自定义http请求

一、安装uni-ui组件库1、安装pnpmi-Dsasspnpmi@dcloudio/uni-ui2、配置组件自动导入使用npm安装好uni-ui之后,需要配置easycom规则,让npm安装的组件支持easycom打开项目根目录下的pages.json并添加easycom节点://pages.json{"easyco

Remix v2 + Cloudflare Pages 集成 Github 登录

RemixAuth特性完整的服务器端身份验证完整的TypeScript支持基于策略的身份验证轻松处理成功和失败实施自定义策略支持持久会话文章目录RemixAuth特性安装依赖封装服务登录及回调登出/注销TypeScript类型FAQ安装依赖npmi--saveremix-authremix-auth-github需要用

热文推荐