广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >关于js的事件循环机制剖析
  • 671
分享到

关于js的事件循环机制剖析

2024-04-02 19:04:59 671人浏览 薄情痞子
摘要

前言 众所周知, javascript是单线程这一核心,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?其中的原理与事件循环机制大有关系。 在探索事件循环之前,我们得先了解浏览

前言

众所周知, javascript是单线程这一核心,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?其中的原理与事件循环机制大有关系。

在探索事件循环之前,我们得先了解浏览器执行线程~~

浏览器的渲染进程是多线程的,浏览器每一个tab标签都代表一个独立的进程,其中浏览器内核属于浏览器多进程中的一种,主要负责页面渲染,脚本执行,事件处理等。其包含的线程有以下几种

GUI 渲染线程:负责渲染页面,解析 htmlCSS 构成 DOM 树;
js 引擎线程:解释执行代码、用户输入和网络请求;
事件处理线程:click、mouse等交互事件发生后将事件函数放入队列;
定时器触发线程:等时间结束后执行函数推入任务队列中;
Http网络请求线程:处理用户的get、post请求,返回结果推入任务队列中。

了解了浏览器渲染流程,还要了解JS的运行机制。JS的运行机制就是事件循环

执行栈

JS运行的环境称之为宿主环境。

执行栈:call stack,一个数据结构,用于存放各种函数的执行环境,每一个函数执行之前,它的相关信息会加入到执行栈。函数调用之前,创建执行环境,然后加入到执行栈;函数调用之后,销毁执行环境。

事件循环

js中所有的任务可以分为同步任务和异步任务,同步任务是立即执行的任务,同步任务一般会直接进入到主线程中执行;而异步任务,就是异步执行的任务,比如ajax网络请求,setTimeout 定时函数等都属于异步任务,异步任务会通过任务队列(先进先出)的机制来进行协调。同步和异步任务分别进入不同的执行环境,同步的进入主线程,即主执行栈,异步的进入任务队列。主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。 这种不断重复就是我们说的 Event Loop (事件循环)。具体流程如下图。

在事件循环中,每进行一次循环操作称为tick,每一次 tick 的任务键的步骤可以总结如下:1.执行一个宏任务(栈中没有就从事件队列中获取);2.执行过程中如果遇到微任务,就将它添加到微任务的任务队列中;3.宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行);4.当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染;5.渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)

宏任务主要包含:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(node.js 环境)
微任务主要包含:Promise、MutaionObserver、process.nextTick(node.js 环境)

事件循环例子


console.log('script start');
//整体 script 作为第一个宏任务进入主线程,遇到 console.log,输出 script start
setTimeout(function() {
  console.log('setTimeout');
}, 0);
//遇到 setTimeout,其回调函数被分发到宏任务 Event Queue 中
Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});
//遇到 Promise,其 then函数被分到到微任务 Event Queue 中,记为 then1,之后又遇到了 then 函数,将其分到微任务 Event Queue 中,记为 then2
console.log('script end');
//遇到 console.log,输出 script end

如此,Event Queue(事件队列)中存在三个任务:宏任务:setTimeout 微任务:then1、then2。执行微任务首先then1,输出 promise1, 然后执行 then2,输出 promise2,这样就清空了所有微任务

执行 setTimeout 任务,输出 setTimeout 至此,输出的顺序是:script start, script end, promise1, promise2, setTimeout

总结:

JavaScript 是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。

到此这篇关于js的事件循环机制的文章就介绍到这了,更多相关js事件循环内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于js的事件循环机制剖析

本文链接: https://www.lsjlt.com/news/127427.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于js的事件循环机制剖析
    前言 众所周知, JavaScript是单线程这一核心,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?其中的原理与事件循环机制大有关系。 在探索事件循环之前,我们得先了解浏览...
    99+
    2022-11-12
  • JavaScript 关于事件循环机制的刨析
    目录前言:一、事件循环和任务队列产生的原因:二、事件循环机制:三、任务队列:3.1 任务队列的类型:3.2 两者区别:3.3 更细致的事件循环过程四、强大的异步专家 process....
    99+
    2022-11-12
  • JS中事件循环机制的示例分析
    小编给大家分享一下JS中事件循环机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、JavaScript是单线程的JavaScript 是一种单线程的...
    99+
    2023-06-29
  • JS的事件循环执行机制详解
    目录前言JS语言的特点JS中同步和异步的使用事件循环是什么?事件循环执行过程微任务和宏任务的区别JS执行/运行机制最后前言 在前端开发中,涉及到JS原生的使用原理是非常重要的知识点,...
    99+
    2023-05-19
    JS事件循环执行机制 JS事件循环 JS事件
  • JS中浏览器事件循环机制的示例分析
    这篇文章将为大家详细讲解有关JS中浏览器事件循环机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先来明白些概念性内容。进程、线程进程是系统分配的独立资源,是 ...
    99+
    2022-10-19
  • 分析IOS RunLoop的事件循环机制
    在RunLoop启动之后会发送一个通知,来告知观察者 将要处理Timer/Source0事件这样一个通知的发送 处理Source0事件 如果有Source1要处理,这时会通过一个go...
    99+
    2022-05-18
    IOS RunLoop
  • 一文详解JS中的事件循环机制
    目录前言1、JavaScript是单线程的2、同步和异步3、事件循环前言 我们知道JavaScript 是单线程的编程语言,只能同一时间内做一件事,按顺序来处理事件,但是在遇到异步事...
    99+
    2022-11-13
  • 实例详解JS中的事件循环机制
    目录一、前言二、宏、微任务三、Tick 执行顺序四、案例详解1.掺杂setTimeout2.掺杂微任务,此处主要是Promise.then3.掺杂async/await一、前言 之前...
    99+
    2022-11-13
  • nodejs中事件循环机制的示例分析
    这篇文章主要介绍了nodejs中事件循环机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前端开发离不开JavaScript,Javascript是一种web前端语...
    99+
    2023-06-14
  • node.js事件循环机制及与js区别详解
    目录一、是什么二、流程三、题目一、是什么 在浏览器事件循环(opens new window)中,我们了解到javascript在浏览器中的事件循环机制,其是根据HTML5定义的规范...
    99+
    2022-11-13
  • Node.js事件循环机制实例代码分析
    这篇文章主要介绍“Node.js事件循环机制实例代码分析”,在日常操作中,相信很多人在Node.js事件循环机制实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node.js事件循环机制实例代码分析...
    99+
    2023-07-04
  • 简单聊聊JavaScript的事件循环机制
    目录前言概念举个栗子TIP再次举个栗子总结前言 JavaScript是一门单线程的弱类型语言,但是我们在开发中,经常会遇到一些需要异步或者等待的处理操作。 类似ajax,亦或者ES6...
    99+
    2022-11-13
  • JavaScript 的setTimeout与事件循环机制event-loop
    目录1.先说说我们都知道的setTimeout2.再讲讲我们可能不知道的setTimeoutevent-loop3. node中的时间循环执行顺序4. 关于事件循环中的promise...
    99+
    2022-11-13
  • 深入了解Javascript的事件循环机制
    目录单线程的Javascript同步 vs 异步 宏任务 vs 微任务定时器To Be Continued单线程的Javascript JavaScript是一种单线程语言,它主要用...
    99+
    2022-11-13
  • Node.js中事件循环的机制是什么
    本篇内容介绍了“Node.js中事件循环的机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先看一个demo:setTimeout((...
    99+
    2023-06-17
  • vue.js的事件循环机制如何理解
    这篇文章主要介绍了vue.js的事件循环机制如何理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue.js的事件循环机制如何理解文章都会有所收获,下面我们一起来看看吧。一、事件循环机制介绍  &n...
    99+
    2023-06-29
  • js中事件传播机制的示例分析
    这篇文章主要介绍js中事件传播机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!事件的默认传播机制:  捕获阶段:从外向里依次查找元素  目标阶段:从当前事件源本身的操作 ...
    99+
    2022-10-19
  • JS中的事件冒泡机制实例分析
    这篇文章主要介绍“JS中的事件冒泡机制实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS中的事件冒泡机制实例分析”文章能帮助大家解决问题。1. 事件在浏览器...
    99+
    2022-10-19
  • JavaScript中的事件循环机制及其运行原理
    javascript是单线程的非阻塞的脚本语言 单线程 只有一个主线程来处理任务。 非阻塞 JS引擎执行异步任务时,不会一直等待返回结果,主线程会挂起(pending)这个任务,继续...
    99+
    2023-05-18
    JavaScript事件循环机制 JS事件循环机制
  • 一篇文章带你了解vue.js的事件循环机制
    目录一、事件循环机制介绍       二、经典事件循环面试题总结一、事件循环机制介绍    ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作