浏览器 事件循环 从 宏队列和微队列 到 延时队列、交互队列、微队列 | js 执行机制 异步程序

同步程序执行完,再执行异步。会出现定时器不准的情况
js 会阻塞渲染 是因为它们运行在同一个线程上

JS 是单线程。因为js只能运行在浏览器的渲染主线程中,而渲染主线程只有一个,而渲染主线程承担着非常的多的事情 , 渲染页面 , 执行js啥啥的 都在里面执行

浏览器的渲染进程 采用何种方式处理定时器任务、交互任务,任务执行顺序的依据 —— 事件循环

浏览器的进程模型

操作系统 进程 线程

随着浏览器功能的丰富。浏览器几乎成为一个“操作系统”
浏览器是多进程多线程应用程序

  1. 浏览器进程

主要负责:浏览器窗口界面、用户交互、子进程(网路、渲染)管理等
2. 网络进程
加载网络资源
3. 渲染进程 (标签页)

渲染进程

渲染主线程
执行HTMl、CSS、JS代码

在这里插入图片描述
线程的任务调度 —— 维护一个消息队列 (任务队列)
这个维护的方式被称为 消息循环 或 事件循环

事件循环

官方叫 event loop 浏览器实现叫 message loop
参考博客
参考视频

运行栈 存储同步任务

任务队列 存储异步任务,存在多个队列,不同队列存在优先级差异

计时器会在到点时,将任务插入到任务队列中

在这里插入图片描述

  1. 任务没有优先级,队列先进先出
  2. 队列有多条,存在优先级

早期分为 微队列和宏队列
在这里插入图片描述
先执行微任务,后执行宏任务

随着浏览器的复杂度急剧提升 W3C不再使用宏队列的说法
提出了任务类型的说法:
一种类型只能在一个队列中,一个队列可包含多种类型。
队列优先级可由浏览器自行决定,
但必须单独一个微队列 绝对优先

在目前chrome的实现中 至少包含了下面的队列:

  • 延时队列 : 用于存放计时器到达后的回调任务 , 优先级中
  • 交互列队 : 用于存放用户操作后产生的事件处理任务 , 优先级高
  • 微队列 : 用户存放需要最快执行的任务 优先级最高

在这里插入图片描述
在这里插入图片描述

一些方法在事件循环中的执行顺序
在这里插入图片描述

在这里插入图片描述

异步是如何实现的?

为什么需要异步?
防止渲染被一些任务阻塞

在这里插入图片描述
单个任务执行事件较长,也会造成等待

js计时器为什么不能做到准确计时?

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JS的循环机制是指如何处理事件循环中的任务。在JS中,事件循环是一种机制,用于处理异步操作和事件处理。循环机制确保任务按照正确的顺序执行,以保证代码的正确性和性能。 在循环机制中,有两种类型的任务:任务(macro-task)和任务(micro-task)。任务包括整体代码块、setTimeout、setInterval等,而任务包括Promise、MutationObserver、process.nextTick等。 当代码执行时,会首先执行当前代码块中的同步任务,然后执行任务队列中的所有任务。接下来,会从任务队列中选择一个任务执行,直到任务队列为空。然后,再次执行所有任务,以此类推。 事件队列是用来存储待执行的任务的数据结构。每个任务或任务都会被添加到事件队列中。当事件循环开始时,会从事件队列中依次取出任务并执行。 需要注意的是,任务的优先级高于任务。也就是说,在执行完当前任务后,会立即执行所有任务,然后再执行下一个任务。这样可以确保任务能够尽早地被执行,避免出现不必要的延迟。 总结一下: - 循环机制确保异步任务按照正确的顺序执行。 - 任务包括整体代码块、setTimeout、setInterval等。 - 任务包括Promise、MutationObserver、process.nextTick等。 - 事件队列用来存储待执行的任务。 - 任务优先级高于任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值