事件循环(也叫事件环,也叫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),就是当屏幕刚好刷新时,会记录下闪动的位置。

相关推荐
长路 ㅤ   4 分钟前
前端技术博客汇总文档
javascript·vue.js·css3·html5·前端技术
独立开阀者_FwtCoder17 分钟前
放弃 JSON.parse(JSON.stringify()) 吧!试试现代深拷贝!
前端·javascript·github
尘世闲鱼1 小时前
解数独(C++版本)
开发语言·c++·算法·解数独
张晓~183399481211 小时前
数字人源码部署流程分享--- PC+小程序融合方案
javascript·小程序·矩阵·aigc·文心一言·html5
爱喝水的小周1 小时前
AJAX vs axios vs fetch
前端·javascript·ajax
Jinxiansen02111 小时前
unplugin-vue-components 最佳实践手册
前端·javascript·vue.js
几道之旅2 小时前
介绍electron
前端·javascript·electron
周胡杰2 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
31535669132 小时前
ClipReader:一个剪贴板英语单词阅读器
前端·后端
玲小珑2 小时前
Next.js 教程系列(十一)数据缓存策略与 Next.js 运行时
前端·next.js