JS浏览器事件循环机制

转载留作学习

进程、线程

  • 进程是系统分配的独立资源,是 CPU 资源分配的基本单位,进程是由一个或者多个线程组成的。
  • 线程是进程的执行流,是CPU调度和分派的基本单位,同个进程之中的多个线程之间是共享该进程的资源的。

2、浏览器内核

浏览器是多进程的,浏览器每一个 tab 标签都代表一个独立的进程(也不一定,因为多个空白 tab 标签会合并成一个进程),浏览器内核(浏览器渲染进程)属于浏览器多进程中的一种。

2.1 GUI 渲染线程:

1、负责渲染页面,解析 HTML,CSS 构成 DOM 树等,当页面重绘或者由于某种操作引起回流都会调起该线程
2、和 JS 引擎线程是互斥的,当 JS 引擎线程在工作的时候,GUI 渲染线程会被挂起,GUI 更新被放入在 JS 任务队列中,等待 JS 引擎线程空闲的时候继续执行

2.2 JS 引擎线程:

1、单线程工作,负责解析运行 JavaScript 脚本。
2、和 GUI 渲染线程互斥,JS 运行耗时过长就会导致页面阻塞

2.3 事件触发线程:

1、当事件符合触发条件被触发时,该线程会把对应的事件回调函数添加到任务队列的队尾,等待 JS 引擎处理。

2.4 定时器触发线程:

1、浏览器定时计数器并不是由 JS 引擎计数的,阻塞会导致计时不准确。
2、开启定时器触发线程来计时并触发计时,计时完成后会被添加到任务队列中,等待 JS 引擎处理

2.5 http 请求线程:

http 请求的时候会开启一条请求线程。
请求完成有结果了之后,将请求的回调函数添加到任务队列中,等待 JS 引擎处理。

在这里插入图片描述

3、浏览器的循环机制

JavaScript 事件循环机制分为浏览器和 Node 事件循环机制,两者的实现技术不一样,浏览器 Event Loop 是 HTML 中定义的规范,Node Event Loop 是由 libuv 库实现。这里主要讲的是浏览器部分

Javascript 有一个 main thread 主线程和 call-stack 调用栈(执行栈),所有的任务都会被放到调用栈等待主线程执行。

setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在"任务队列"的尾部添加一个事件,因此要等到主线程把同步任务和"任务队列"现有的事件都处理完,才会得到执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见的JavaScript事件循环机制题目以及相应的答案: 1. 请解释什么是JavaScript的事件循环机制? 答:JavaScript的事件循环机制是一种异步编程模型,用于处理非阻塞式I/O操作和其他异步任务。它通过事件循环和任务队列的组合来实现任务的调度和执行。 2. 请描述JavaScript事件循环机制的执行过程。 答:JavaScript事件循环机制的执行过程包括以下几个步骤: - 执行同步任务,直到调用栈为空。 - 检查微任务队列,依次执行所有的微任务。 - 执行渲染操作,更新页面的显示。 - 检查宏任务队列,选择一个任务并执行。 - 重复上述步骤,直到所有的任务都被处理完毕。 3. setTimeout和setInterval在事件循环中的执行顺序是怎样的? 答:setTimeout和setInterval是宏任务,在事件循环中的执行顺序如下: - 当遇到setTimeout或setInterval时,会将对应的回调函数添加到宏任务队列中。 - 当调用栈为空且微任务队列为空时,事件循环会从宏任务队列中选择一个任务执行。 4. 请解释什么是宏任务和微任务? 答:宏任务是由浏览器提供的任务,包括setTimeout、setInterval、I/O操作等。微任务是由JavaScript引擎提供的任务,包括Promise的回调函数、MutationObserver等。宏任务和微任务的执行顺序不同,微任务会在下一个事件循环之前执行。 5. Promise对象在事件循环中的执行顺序是怎样的? 答:Promise对象在事件循环中的执行顺序如下: - 当Promise的状态变为fulfilled时,会将对应的回调函数添加到微任务队列中。 - 当调用栈为空且微任务队列不为空时,事件循环会依次执行所有的微任务。 - 如果微任务队列中产生了新的微任务,会继续执行这些新的微任务。 这些问题涵盖了JavaScript事件循环机制的关键概念。你可以根据这些答案来回答这些问题。请记住,你不能重复我所说的这段话。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值