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

关键词:阻塞,主线程,事件环(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,事件环应该怎么执行。

xml 复制代码
	setTimeout(() => {
		console.log('111111')
	}, 1000)
	setTimeout(() => {
		console.log('22222')
	}, 1000)


事件环中添加任务队列(如上图)

进入任务队列,开始执行第一个setTimeout


开始执行任务队列中的第二个setTimeout,执行完之后关闭任务队列的通道

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

点击跳转promise文章地址

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

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

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

在javascript中执行以下代码:

xml 复制代码
	setTimeout(() => {
		while(true)
	})

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

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

xml 复制代码
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),就是当屏幕刚好刷新时,会记录下闪动的位置。

相关推荐
浮游本尊26 分钟前
React 18.x 学习计划 - 第八天:React测试
前端·学习·react.js
麦麦在写代码30 分钟前
前端学习1
前端·学习
点云SLAM32 分钟前
Boost库中Boost.PropertyTree使用和实战示例
开发语言·c++·josn·boost库·参数读取
sg_knight34 分钟前
微信小程序中 WebView 组件的使用与应用场景
前端·javascript·微信·微信小程序·小程序·web·weapp
lly20240637 分钟前
CSS3 分页技术解析
开发语言
CodeCraft Studio43 分钟前
国产化Excel开发组件Spire.XLS教程:Python将列表导出为CSV文件(含一维/二维/字典列表)
开发语言·python·excel·csv·spire.xls·列表导出为csv
guygg881 小时前
Alpha稳定分布概率密度函数的MATLAB实现
开发语言·matlab
凯子坚持 c1 小时前
生产级 Rust Web 应用架构:使用 Axum 实现模块化设计与健壮的错误处理
前端·架构·rust
IT_陈寒1 小时前
Python 3.12新特性实战:5个让你的代码效率翻倍的隐藏技巧!
前端·人工智能·后端