iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解JavaScript事件循环
  • 286
分享到

详解JavaScript事件循环

JavaScript事件循环JavaScript循环 2023-05-16 17:05:17 286人浏览 安东尼
摘要

目录一、事件循环的执行过程二、事件循环进阶用法三、javascript任务类型3.1 同步任务&异步任务3.2 宏任务&微任务JavaScript事件循环是一种机制,

JavaScript事件循环是一种机制,用于处理异步事件和回调函数。它是JavaScript运行时环境的一部分,负责管理事件队列和调用栈。

事件循环的基本原理是事件循环的核心是一个事件队列,所有的事件都被放入这个队列中,然后按照顺序依次执行。如果队列为空,JavaScript会等待新的任务加入队列。当JavaScript代码执行时,所有同步任务都会被立即执行,而异步任务则会被放入事件队列中。

当所有同步任务执行完毕后,事件循环会从事件队列中取出一个任务,并将其放入调用栈中执行。当该任务执行完毕后,事件循环会再次从事件队列中取出下一个任务,并重复这个过程。

一、事件循环的执行过程

1、执行同步代码,直到遇到第一个异步事件(如setTimeout、setInterval、Promise等)。

2、将异步事件放入事件队列中,并继续执行同步代码。

3、当所有同步代码执行完毕后,JavaScript引擎会检查事件队列中是否有事件需要执行。

4、如果事件队列中有事件需要执行,JavaScript引擎会将第一个事件取出来,并执行对应的回调函数。

5、执行完回调函数后,JavaScript引擎会再次检查事件队列中是否有事件需要执行,如果有则重复步骤4,否则继续等待新的事件加入事件队列。

需要注意的是,事件循环是单线程的,也就是说JavaScript引擎在同一时间只能执行一个任务。

因此,如果一个任务执行时间过长,会阻塞事件循环,导致其他任务无法执行。为了避免这种情况,可以将长时间的任务拆分成多个小任务,使用setTimeout或setInterval分批执行。

另外,Promise也是基于事件循环的机制实现的。当Promise状态发生改变时,会将对应的回调函数放入微任务队列中,等待当前任务执行完毕后立即执行。因此,Promise的回调函数总是在当前任务执行完毕后立即执行,而不会被放入事件队列中等待执行。

二、事件循环进阶用法

1、Promise:Promise是一种异步编程的解决方案,它可以将异步操作转化为同步操作的形式,使得代码更加简洁易懂。Promise的基本原理是将异步操作封装成一个Promise对象,通过then方法来处理异步操作的结果。

2、async/await:async/await是ES2017引入的一种异步编程的解决方案,它可以让异步代码看起来像同步代码,使得代码更加易读易懂。async/await的基本原理是使用async关键字定义一个异步函数,然后在函数内部使用await关键字来等待异步操作的结果。

3、定时器:JavaScript中有两种定时器,分别是setTimeout和setInterval。setTimeout用于在指定的时间后执行一次任务,而setInterval则用于每隔一段时间执行一次任务。这两种定时器都是异步任务,会被放入任务队列中等待执行。

三、JavaScript任务类型

JavaScript中的任务按照不同纬度进行区分主要分为同步任务和异步任务、宏任务和微任务。

3.1 同步任务&异步任务

1、 同步任务按照代码顺序执行的任务。

2、 异步任务是在将来某个时间点执行的任务。异步任务通常是由事件触发器(如鼠标点击、网络请求等)生成的。 当一个异步任务被触发时,它会被放入任务队列中等待执行。

JavaScript事件循环的执行顺序可以用以下伪代码表示:

while (queue.waitFORMessage()) { 
    queue.processNextMessage(); 
} 

在这个伪代码中,queue.waitForMessage()表示等待队列中有待执行的任务,queue.processNextMessage()表示取出队列中的下一个任务并执行。

需要注意的是,JavaScript事件循环的执行顺序是不可中断的。这意味着当一个任务正在执行时,其他任务必须等待,直到当前任务完成。因此,如果一个任务执行时间过长,会导致其他任务无法及时执行,从而影响应用程序的性能和响应速度。

3.2 宏任务&微任务

1、宏任务包括setTimeout、setInterval、I/O操作等。

2、微任务包括Promise、MutationObserver等。

当事件循环从事件队列中取出一个任务时,它会先执行所有微任务,然后再执行一个宏任务。这个过程会一直重复,直到事件队列中的所有任务都被执行完毕。

下面是一个例子:

console.log('1'); 

setTimeout(function() { 
    console.log('2'); 
    Promise.resolve().then(function() { 
        console.log('3'); 
    }); 
}, 0); 

Promise.resolve().then(function() { 
    console.log('4'); 
}); 
console.log('5'); 

// 输出结果为: 1 5 4 2 3 

执行顺序:

  • 执行第一个console.log,输出1。
  • 执行setTimeout,将其回调函数放入宏任务队列中。
  • 执行Promise.resolve().then,将其回调函数放入微任务队列中。
  • 执行第二个console.log,输出5。
  • 当前任务执行结束,执行微任务队列中的所有任务,输出4。
  • 执行宏任务队列中的第一个任务,即setTimeout的回调函数,输出2。
  • 执行Promise.resolve().then的回调函数,输出3。

需要注意的是,微任务和宏任务的执行顺序是固定的,即先执行所有微任务,再执行宏任务。因此,如果在一个宏任务中产生了新的微任务,那么这些微任务会在下一个宏任务执行之前执行。

下面是一个例子:

console.log('1'); 

setTimeout(function() { 
    console.log('2'); 
    Promise.resolve().then(function() { 
        console.log('3'); 
    }); 
}, 0); 

Promise.resolve().then(function() { 
    console.log('4'); 
    setTimeout(function() { 
        console.log('5'); 
    }, 0); 
}); 

console.log('6'); 

// 输出结果为:1 6 4 2 3 5

执行顺序:

  • 执行第一个console.log,输出1。
  • 执行setTimeout,将其回调函数放入宏任务队列中。
  • 执行Promise.resolve().then,将其回调函数放入微任务队列中。
  • 执行第三个console.log,输出6。
  • 当前任务执行结束,执行微任务队列中的所有任务,输出4。
  • 执行宏任务队列中的第一个任务,即setTimeout的回调函数,输出2。
  • 执行Promise.resolve().then的回调函数,将setTimeout的回调函数放入宏任务队列中。
  • 当前任务执行结束,执行微任务队列中的所有任务,输出3。
  • 执行宏任务队列中的第一个任务,即setTimeout的回调函数,输出5。

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

--结束END--

本文标题: 详解JavaScript事件循环

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

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

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

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

下载Word文档
猜你喜欢
  • 详解JavaScript事件循环
    目录一、事件循环的执行过程二、事件循环进阶用法三、JavaScript任务类型3.1 同步任务&异步任务3.2 宏任务&微任务JavaScript事件循环是一种机制,...
    99+
    2023-05-16
    JavaScript事件循环 JavaScript循环
  • Javascript前端事件循环机制详细讲解
    目录一、消息队列和事件循环1.单线程处理机制2.事件循环机制3.消息队列4.IO线程5.页面使用单线程的缺点二、setTimeout1.浏览器怎么实现 setTimeout2.使用s...
    99+
    2022-12-30
    JavaScript事件循环机制 JS循环机制
  • JavaScript之事件循环案例讲解
    js中的事件循环 因为JavaScript是单线程的,同一事件只能执行一种方法,所以会将程序中的方法加入到执行栈中按照后进先出的顺序依次执行,当遇见异步任务时不会被阻塞,而是将任务放...
    99+
    2024-04-02
  • JavaScript中事件循环总结
    这篇文章主要讲解了“JavaScript中事件循环总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中事件循环总结”吧!js中的事件循环因为JavaScript是单线程的...
    99+
    2023-06-20
  • JavaScript事件循环实例分析
    这篇文章主要讲解了“JavaScript事件循环实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript事件循环实例分析”吧!前言异步函数也是有执行顺序的。本质上来说,Ja...
    99+
    2023-07-02
  • JavaScript中的事件循环方式
    目录概述原理同步>微任务>宏任务案例解析能否先将promise.then分发到微任务中js是单线程,非阻塞,试想如果是多线程,一个线程在某个DOM节点上添加内容,另一个线...
    99+
    2024-04-02
  • Javascript单线程和事件循环
    目录一、单线程二、事件循环三、事件循环的应用四、使用代码来说明五、setTimeout()六、思考:劣质的优化一、单线程 Javascript 是单线程的,意味着不会有其他线程来竞争...
    99+
    2024-04-02
  • 深入了解Javascript的事件循环机制
    目录单线程的Javascript同步 vs 异步 宏任务 vs 微任务定时器To Be Continued单线程的Javascript JavaScript是一种单线程语言,它主要用...
    99+
    2024-04-02
  • JavaScript中怎么实现事件循环
    今天就跟大家聊聊有关JavaScript中怎么实现事件循环,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.Main.js 执行2.调用second...
    99+
    2024-04-02
  • JS的事件循环执行机制详解
    目录前言JS语言的特点JS中同步和异步的使用事件循环是什么?事件循环执行过程微任务和宏任务的区别JS执行/运行机制最后前言 在前端开发中,涉及到JS原生的使用原理是非常重要的知识点,...
    99+
    2023-05-19
    JS事件循环执行机制 JS事件循环 JS事件
  • 详解Javascript基础之循环
    目录循环forfor-infor-ofwhiledo-while跳出循环总结循环 for 循环是任何一门语言都会有个命令,用于反复执行某段代码。 例如,循环代码块5次: for ...
    99+
    2024-04-02
  • 一文详解JS中的事件循环机制
    目录前言1、JavaScript是单线程的2、同步和异步3、事件循环前言 我们知道JavaScript 是单线程的编程语言,只能同一时间内做一件事,按顺序来处理事件,但是在遇到异步事...
    99+
    2024-04-02
  • 实例详解JS中的事件循环机制
    目录一、前言二、宏、微任务三、Tick 执行顺序四、案例详解1.掺杂setTimeout2.掺杂微任务,此处主要是Promise.then3.掺杂async/await一、前言 之前...
    99+
    2024-04-02
  • JavaScript之事件循环的示例分析
    这篇文章主要介绍JavaScript之事件循环的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!js中的事件循环因为JavaScript是单线程的,同一事件只能执行一种方法,所以会将程序中的方法加入到执行栈中按...
    99+
    2023-06-20
  • JavaScript中的for循环与双重for循环详解
    for循环 for循环就是对数组的元素进行循环。 语法: for (初始化变量; 条件表达式; 迭代语句) {      需要执行的代码块...
    99+
    2024-04-02
  • JavaScript事件循环的原理是什么
    今天小编给大家分享一下JavaScript事件循环的原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。理解 JavaS...
    99+
    2023-07-04
  • javascript 实例详解循环用法
    闲来无聊,整理了几道有关循环的简单练习题,希望对初学JS的小伙伴有所帮助。 1.打印1-100之间所有7的倍数的个数及总和 var sum=0; var n=0; for(var...
    99+
    2024-04-02
  • JavaScript程序循环结构详解
    目录选择结构循环结构whiledo … whilefor 循环for … in …for …of…小结终止循环breakcontinue二层循环总结选择结构 单分支的if结构 i...
    99+
    2024-04-02
  • 全面了解Node事件循环
    目录Node事件循环事件循环图主线程事件循环 圈timers队列的工作原理poll队列的运作方式举例梳理事件流程check 阶段setImmediate() 与 setTimeout...
    99+
    2024-04-02
  • 带你了解NodeJS事件循环
    浏览器中存在两个任务队列,一个是宏任务一个是微任务。但是在NodeJS中一共存在六个事件队列,timers,pending callbacks,idle prepare,poll,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作