广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Javascript运行机制之EventLoop
  • 537
分享到

Javascript运行机制之EventLoop

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

目录一、四个概念1、javascript是单线程2、任务队列3、同步任务、异步任务4、Javascript执行栈二、Event Loop三、实战一、四个概念 1、Javascrip

一、四个概念

1、Javascript是单线程

单线程意味着我们的js代码只能从上往下同步执行,同一时间只能执行一个任务,这会导致某些执行时间较长或者执行时间不确定的任务会卡住其它任务的正常执行,Event Loop出现的原因正是为了解决此问题。

2、任务队列

为了解决上述的排队问题,有了任务队列,浏览器在异步任务有了结果后,将其添加到任务队列,以待将来执行,其他任务就在主线程上同步执行。

这里要注意的是,向任务队列中添加任务的时机是异步任务有结果后。其实任务队列中存在的就是异步任务的回调函数。

3、同步任务、异步任务

Js程序中的同步任务是指在主线程中执行的任务,异步任务是指进入任务队列中的任务

4、Javascript执行栈

所有的同步任务都在主线程上执行,行成一个执行栈。当主线程上任务执行完毕后,从任务队列中取出任务执行。


var name = "zhouwei";

setTimeout(() => {
    console.log(1);
}, 1000);

console.log(name);


上面代码在浏览器中执行如下,我们将程序全局执行环境的代码理解为包裹在一个main函数中的代码,这段代码的执行栈变化如下图:

  • 开始执行代码,将main任务(全局代码入栈执行),当遇到异步任务(setTimeout后)。
  • 浏览器接管异步任务,并在1s后将异步任务的结果(回调函数)添加到任务队列。
  • 执行栈中的同步任务执行完毕,此时任务队列为空(未到1s),执行栈也为空
  • 异步任务有结果后,首先进入任务队列排队(因为可能有很多异步任务)。
  • 执行栈从任务队列中取出任务开始同步执行。
  • 重复执行第5步。

二、Event Loop

Js执行栈不断的从任务队列中读取任务并执行的过程就是Event Loop

我们知道任务队列中存放的是异步任务的结果,那么异步任务都有哪些了?

  • 1、事件

Javascript中的事件有很多,都是属于异步任务。由浏览器接管,当事件触发时,将事件的回调加入的任务队列中,在Js执行栈中没有任务时执行。

  • 2、Http请求
  • 3、定时器
  • 4、requestAnimationFrame等

宏任务(Macrotask)和微任务(microtask)
在了解了任务队列和Event Loop后,我们知道了Js执行栈从任务队列中读取任务执行,但这个具体工程我们任务不清楚,这里引出了宏任务和微任务的的概念,帮助我们理解Event Loop。

进入任务队列中的异步任务回调分为了宏任务和微任务, Js执行栈执行宏任务和微任务的规则如下图所示。

Js执行栈首先执行一个宏任务(全局代码) -> 从任务队列中读取所有微任务执行 -> UI rendering(浏览器渲染界面) -> 从任务队列读取一个宏任务 -> 所有微任务 -> UI rendering -> …

在每一轮的Event Loop结束后(1个宏任务 + 所有微任务),浏览器开始渲染界面(如果有需要渲染的UI,否则不执行UI rendering),在UI rendering结束后,开始下一轮Event Loop。

哪些是宏任务?

  • setTimeout
  • setInterval
  • setImmediate (node)
  • requestAnimationFrame (浏览器)
  • I/O (事件回调)
  • UI rendering (浏览器渲染)

哪些是微任务?

  • Promise
  • process.nextTick (Node)
  • MutationObserver (现代浏览器提供的用来检测 DOM 变化的网页接口)

setTimeout延时问题

一般来说在代码中setTimeout中回调的执行时间都是大于设置的时间。 这是因为在setTimeout指定时间到达后,虽然回调函数被添加到了任务队列,但是此时Js执行栈中可能有正在执行的任务,此回调需要等待Js执行栈的任务执行完毕后才有机会执行,这就是setTimeout延时问题。

三、实战

练习下下方代码输出结果吧:


console.log(1);

setTimeout(() => {
    console.log(2);
    Promise.resolve().then(() => {
        console.log(3)
    });
});

new Promise(resolve => {
    console.log(4);
    setTimeout(() => {
        console.log(5);
    });
    resolve(6)
}).then(data => {
    console.log(data);
})

setTimeout(() => {
    console.log(7);
})

console.log(8);

用上方的我们说过的js执行机制来分析这道题:

1: 执行全局任务中的同步代码输出:

1
4
8

这里需要注意的是Promise接受的handle函数是同步任务,而then方法是异步任务,所以会直接输出4。

2: 这时的任务队列中有三个setTimeout的宏任务,和一个Promise的微任务


// 此时的宏任务是

setTimeout(() => {
    console.log(2);
    Promise.resolve().then(() => {
        console.log(3)
    });
});

setTimeout(() => {
    console.log(5);
});


setTimeout(() => {
    console.log(7);
})

// 此时微任务是
then(data => {
    console.log(data);
})

执行一个微任务, 输出:6

3: 接着执行第一个宏任务


setTimeout(() => {
    console.log(2);
    Promise.resolve().then(() => {
        console.log(3)
    });
});


输出:2

在此宏任务中,向任务 队列添加了一个微任务。此时任务队列有了新的微任务。

4:执行一个微任务,输出:3


then(() => {
   console.log(3)
});


5: 继续按照规则执行任务, 输出: 5、7

整体输出情况是:

1、4、8、6、2、3、5、7

你的答案是不是这样呢?

总结:

  • javascritp的任务分为同步任务和异步任务
  • 同步任务在主线程(Js执行栈)中执行,异步任务被其他线程接管,并在异步任务有结果后,将其回调添加到任务队列。
  • 任务队列中的任务分为了宏任务和微任务。Js执行栈总是先执行一个宏任务,再执行完所有微任务…

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

--结束END--

本文标题: Javascript运行机制之EventLoop

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

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

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

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

下载Word文档
猜你喜欢
  • Javascript运行机制之EventLoop
    目录一、四个概念1、Javascript是单线程2、任务队列3、同步任务、异步任务4、Javascript执行栈二、Event Loop三、实战一、四个概念 1、Javascrip...
    99+
    2022-11-12
  • JS的执行机制(EventLoop、宏任务和微任务)
    目录1、EventLoop1. JavaScript 是单线程的语言2. 同步任务和异步任务3. 同步任务和异步任务的执行过程 4. EventLoop 的基本概念&nbs...
    99+
    2023-01-28
    JS执行机制 JS EventLoop JS宏任务 JS微任务
  • JavaScript运行机制是怎么样的
    这篇文章主要介绍了JavaScript运行机制是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JS的运行机制1. js单线程Java...
    99+
    2022-10-19
  • 深入阐述JavaScript的运行机制
    JavaScript是一种流行的编程语言,它几乎被用于网站和应用程序的开发中。对于初学者和许多开发人员来说,JavaScript似乎是单线程的,这意味着它只能同时执行一个任务。然而,JavaScript到底是不是真的单线程呢?这是一个有争议...
    99+
    2023-05-14
  • JavaScript运行机制及原理是什么
    这篇文章主要介绍“JavaScript运行机制及原理是什么”,在日常操作中,相信很多人在JavaScript运行机制及原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • JavaScript 运行机制详解再浅谈Event Loop
    目录一、为什么JavaScript是单线程?二、任务队列三、事件和回调函数四、Event Loop五、定时器六、Node.js的Event Loop一、为什么JavaScript是单...
    99+
    2022-11-12
  • 手机javascript运行错误
    近年来,手机已经成为我们日常生活中不可或缺的一部分,而javascript作为现代web开发中最常用的技术之一,也是手机应用开发的重要组成部分。但是,在手机应用开发中,javascript运行错误成为了一个频繁出现的问题,给开发者带来了困扰...
    99+
    2023-05-17
  • kubernetes实践之五十一:kube-proxy运行机制分析
    一: Service,Endpoints与Pod的关系Kube-proxy进程获取每个Service的Endpoints,实现Service的负载均衡功能二:Service的负载均衡转发规则访问Service的请求,不论是Cluster I...
    99+
    2023-06-04
  • JavaScript中的事件循环机制及其运行原理
    javascript是单线程的非阻塞的脚本语言 单线程 只有一个主线程来处理任务。 非阻塞 JS引擎执行异步任务时,不会一直等待返回结果,主线程会挂起(pending)这个任务,继续...
    99+
    2023-05-18
    JavaScript事件循环机制 JS事件循环机制
  • oracle 之 控制oracle RAC 进行并行运算
     RAC的一大优点就是可以跨节点进行并行计算,那么如何控制并行运算?这就是这篇文章要讨论的内容。 10 g 中: 合理设置跨节点并行,需要先设置一些参数: ins...
    99+
    2022-10-18
  • JS运行机制实例分析
    本篇内容主要讲解“JS运行机制实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS运行机制实例分析”吧! 1.为什么JS是单线程的 JS的单线程,与它...
    99+
    2022-10-19
  • 如何进行C++运行机制的介绍
    这期内容当中小编将会给大家带来有关如何进行C++运行机制的介绍,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++编程语言是一款应用广泛,功能强大的编程应用语言。它支持多重编程范式的通用程序设计语言,并且...
    99+
    2023-06-17
  • java运行机制指的是什么
    这篇文章给大家分享的是有关java运行机制指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java程序运行时,必须经过编译和运行两个步骤:首先将后缀名为java的源文件进行编译,最终生成后缀名为.clas...
    99+
    2023-06-06
  • Laravel中schedule调度的运行机制
    目录⒈ runInBackground 和 withoutOverlapping⑴ runInBackground() 方法⑵ withoutOverlapping() 方法⒉ mu...
    99+
    2022-11-12
  • React运行机制超详细讲解
    目录适合人群写源码之前的必备知识点JSX虚拟Dom原理简介手写react过程基本架子的搭建React的源码ReactDom.renderReactDom.Component简单源码适...
    99+
    2022-11-13
    React运行机制 React运行原理
  • java中MyBatis的运行机制是什么
    今天就跟大家聊聊有关java中MyBatis的运行机制是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程...
    99+
    2023-06-14
  • 解析Android应用程序运行机制
    在标准的Windows和Linux桌面操作系统中,同时可以在不同的窗口中运行多个应用程序,每次只有一个应用程序是当前焦点状态,但其他的应用程序都是一个平等的位置。用户可以随时切...
    99+
    2022-06-06
    运行 程序 Android
  • 一文搞懂MySQL运行机制原理
    目录前言mysql服务器体系架构网络连接层服务层存储引擎层系统文件层服务器处理客户端请求连接管理解析与优化查询缓存语法解析查询优化存储引擎小结前言 前文我们了解了MySQL采用客户端/服务器架构,用户通过客户端程序发送增...
    99+
    2022-09-30
  • web小程序运行机制是什么
    本篇内容介绍了“web小程序运行机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!了解小程序的由来在...
    99+
    2022-10-19
  • .NET Framework运行机制知识有哪些
    本篇文章为大家展示了.NET Framework运行机制知识有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。认真的学习掌握.NET Framework运行机制,有益于我们实际开发。在这里我们将会...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作