广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >深入了解Javascript的事件循环机制
  • 720
分享到

深入了解Javascript的事件循环机制

2024-04-02 19:04:59 720人浏览 独家记忆
摘要

目录单线程的javascript同步 vs 异步 宏任务 vs 微任务定时器To Be Continued单线程的Javascript JavaScript是一种单线程语言,它主要用

单线程的Javascript

JavaScript是一种单线程语言,它主要用来与用户互动,以及操作DOM。多线程需要共享资源、且有可能修改彼此的运行结果,且存在上下文切换。

js 运行的时候可能会阻止 UI 渲染,这说明两个线程是互斥的。这是因为 JS 可以修改 DOM,如果在 JS 执行的时候 UI 线程还在工作,就可能导致不能安全的渲染 UI。

JS 是单线程运行的,可以达到节省内存,节约上下文切换时间。

为了利用多核CPU的计算能力,HTML5提出WEB Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。

单线程的同步等待极大影响效率,任务不得不一个一个等待执行,对于网页应用是无法接受的。所以Javascript使用事件循环机制来解决异步任务的问题。

同步 vs 异步 宏任务 vs 微任务

首先了解下同步和异步的区别:

  • 同步:在一个函数返回的时候,调用者就能够得到预期结果。
  • 同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
  • 异步:在函数返回的时候,调用者还不能够得到预期结果,而是需要在将来通过一定的手段得到。
  • 异步任务:不进入主线程、而放在"任务队列"中的任务,若有多个异步任务,则需排队等待进入主线程执行栈中被执行。

任务队列其实不止一种,根据任务种类的不同,可以分为微任务(micro task)队列和宏任务(Macro task)队列。常见的任务如下:

  • 宏任务:script(整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate;需要特定的异步线程去执行,有明确的异步任务去执行,有回调。
  • 微任务:Promise、MutaionObserver、process.nextTick(node.js 环境,会先于其他微任务执行);不需要特定的异步线程去执行,没有明确的异步任务去执行,只有回调。

一次 Eventloop 循环会处理一个宏任务和所有这次循环中产生的微任务。 执行顺序如下图:

第一个例子:

var req = new XMLHttpRequest();
req.open('GET', url);    
req.onload = function (){};    
req.onerror = function (){};    
req.send();
//等同于
var req = new XMLHttpRequest();
req.open('GET', url);
req.send();
req.onload = function (){};    
req.onerror = function (){};

上面代码中的req.send方法是ajax操作向服务器发送数据,它是一个异步任务,意味着只有当前脚本的所有代码执行完,系统才会去读取"任务队列"。指定回调函数的部分(onload和onerror),在send()方法的前面或后面无关紧要,因为它们属于执行栈的一部分,系统总是执行完它们,才会去读取"任务队列"。

第二个例子:

console.log('1 第一次循环 开始执行');
setTimeout(function () {
    console.log('2 第二次循环 开始执行');
    new Promise(function (resolve) {
        console.log('3 第二次循环 宏任务结束');
        resolve();
    }).then(function () {
        console.log('4 第二次循环 微任务执行')
    })
}, 0)
new Promise(function (resolve) {
    console.log('5 第一次循环 宏任务结束');
    resolve();
}).then(function () {
    console.log('6 第一次循环 微任务执行')
})

setTimeout(function () {
    console.log('7 第三次循环 开始执行');

    new Promise(function (resolve) {
        console.log('8 第三次循环 宏任务结束');
        resolve();
    }).then(function () {
        console.log('9 第三次循环 微任务执行')
    })
}, 0)

定时器

定时器功能主要由setTimeout()和setInterval()这两个函数来完成,它们的内部运行机制完全一样,区别在于前者指定的代码是一次性执行,后者则为反复执行。

如果将setTimeout()的第二个参数设为0,就表示当前代码执行完(执行栈清空)以后,立即执行(0毫秒间隔)指定的回调函数。主线程尽可能早得执行,但是没有办法保证回调函数一定会在setTimeout()指定的时间执行,因为必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。所以单线程无法实现真正的异步,因为还是存在阻塞。

html5标准规定了setTimeout()的第二个参数的最小值(最短间隔),不得低于4毫秒,如果低于这个值,就会自动增加。

在此之前,老版本的浏览器都将最短间隔设为10毫秒。

另外,对于那些DOM的变动(尤其是涉及页面重新渲染的部分),通常不会立即执行,而是每16毫秒执行一次。

这时使用requestAnimationFrame()的效果要好于setTimeout()。

node.js环境下,还提供了另外两个方法:

  • process.nextTick方法可以在当前"执行栈"的尾部,下一次Event Loop之前,触发回调函数。也就是说,它指定的任务总是在本次"事件循环"触发,发生在所有异步任务之前,同时也是在所有微任务之前执行。
  • setImmediate方法则是在当前"任务队列"的尾部添加事件,也就是说,它指定的任务总是在之后的Event Loop执行,这与setTimeout(fn, 0)很像。

多个process.nextTick​语句总是在当前"执行栈"一次执行完,多个setImmediate则可能需要多次loop才能执行完。

To Be Continued

Node.js使用V8作为js的解析引擎,而I/O处理方面使用了自己设计的libuv,libuv是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的api,事件循环机制也是它里面的实现的。(在python中,uvloop,一个完整的asyncio事件循环的替代品,也是建立在libuv基础之上,是由Cython编写而成。)这个机制和浏览器中Javascript的事件循环机制是不太一样的。

以上就是深入了解Javascript的事件循环机制的详细内容,更多关于Javascript事件循环机制的资料请关注编程网其它相关文章!

--结束END--

本文标题: 深入了解Javascript的事件循环机制

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

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

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

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

下载Word文档
猜你喜欢
  • 深入了解Javascript的事件循环机制
    目录单线程的Javascript同步 vs 异步 宏任务 vs 微任务定时器To Be Continued单线程的Javascript JavaScript是一种单线程语言,它主要用...
    99+
    2022-11-13
  • 深入了解Node事件循环(EventLoop)机制
    主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。下面本篇文章就来带大家掌握Node.js中的eventloop,希望对大家有所帮助!虽然js可以在浏览器...
    99+
    2023-05-14
    javascript Node.js 面试 前端
  • 深入理解JavaScript事件机制
    目录如何实现一个事件的发布订阅介绍下事件循环宏任务和微任务的区别如何实现一个事件的发布订阅 可以通过以下步骤实现 JavaScript 中的发布-订阅模式: 创建一个事件管理器对象。...
    99+
    2023-05-17
    JavaScript事件机制 JS事件机制
  • 如何深入了解JavaScript中的for循环
    本篇文章给大家分享的是有关如何深入了解JavaScript中的for循环,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在ECMAScript5...
    99+
    2022-10-19
  • 深入理解JavaScript的事件执行机制
    目录前言 浏览器 JS 异步执行的原理 浏览器中的事件循环 执行栈与任务队列 宏任务和微任务 Async/await的运行顺序特点示例 个人分析前言 熟悉事件循环,了解浏览器运行机...
    99+
    2022-11-12
  • Javascript前端事件循环机制详细讲解
    目录一、消息队列和事件循环1.单线程处理机制2.事件循环机制3.消息队列4.IO线程5.页面使用单线程的缺点二、setTimeout1.浏览器怎么实现 setTimeout2.使用s...
    99+
    2022-12-30
    JavaScript事件循环机制 JS循环机制
  • Node异步和事件循环的深入讲解
    目录前言为什么要异步?如何实现异步?基于事件循环的异步编程模型timerspendingidle、preparepollcheckclose一些注意事项总结参考资料前言 Node 最...
    99+
    2022-11-13
  • 带你深入了解Android的事件分发机制
    Android的事件分发机制是指在Android系统中,如何将用户的触摸事件、按键事件等传递给正确的View进行处理的一套机制。它是Android应用程序中实现交互的重要部分,确保用户的操作能够被正确地捕获和处理。 Android的事件分发...
    99+
    2023-08-18
    android android studio ui 知识图谱 事件分发
  • JavaScript 关于事件循环机制的刨析
    目录前言:一、事件循环和任务队列产生的原因:二、事件循环机制:三、任务队列:3.1 任务队列的类型:3.2 两者区别:3.3 更细致的事件循环过程四、强大的异步专家 process....
    99+
    2022-11-12
  • 简单聊聊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 事件:常用的事件:事件操作总结JavaScript 事件: 事件指的就是当某些组件执行了某些操作后,会触发某些代码的执行。 常用的事件: ...
    99+
    2022-11-12
  • 一篇文章带你了解vue.js的事件循环机制
    目录一、事件循环机制介绍       二、经典事件循环面试题总结一、事件循环机制介绍    ...
    99+
    2022-11-13
  • 深入了解Spring的事务传播机制
    目录Spring 事务传播机制有哪些?事务传播机制使用与演示REQUIRED 使用演示REQUIRED_NEW 使用演示NESTED 使用演示总结Spring 事务传播机制是指,包含...
    99+
    2022-11-13
  • Android消息循环机制源码深入理解
    Android消息循环机制源码前言:搞Android的不懂Handler消息循环机制,都不好意思说自己是Android工程师。面试的时候一般也都会问这个知识点,但是我相信大多数码农肯定是没有看过相关源码的,顶多也就是网上搜搜,看看别人的文章...
    99+
    2023-05-31
    android 消息 机制
  • JavaScript事件流:深入理解事件处理和传播机制
    引言 JavaScript中的事件流是一种机制,用于描述和处理事件在DOM树中的传播过程。了解事件流的属性和工作原理对于编写高效的事件处理代码和实现复杂的交互功能至关重要。本文将详细介绍JavaSc...
    99+
    2023-09-14
    javascript 开发语言 ecmascript 原力计划
  • JS的事件循环执行机制详解
    目录前言JS语言的特点JS中同步和异步的使用事件循环是什么?事件循环执行过程微任务和宏任务的区别JS执行/运行机制最后前言 在前端开发中,涉及到JS原生的使用原理是非常重要的知识点,...
    99+
    2023-05-19
    JS事件循环执行机制 JS事件循环 JS事件
  • vue.js的事件循环机制如何理解
    这篇文章主要介绍了vue.js的事件循环机制如何理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue.js的事件循环机制如何理解文章都会有所收获,下面我们一起来看看吧。一、事件循环机制介绍  &n...
    99+
    2023-06-29
  • 深入理解Node.js 事件循环和回调函数
    本文详细的介绍了Node.js 事件循环和Node.js回调函数,废话不多说了,具体看下面把。 一、Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能...
    99+
    2022-06-04
    回调 函数 事件
  • 深入理解异步事件机制
    通过了解异步设计的由来,来深入理解异步事件机制。 代码地址 什么是异步 同步 并发(Concurrency) 线程(Thread) I/O多路复用 异步(Asynchronous) 回调(Callback) 参考文...
    99+
    2023-01-31
    机制 事件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作