简单聊聊JavaScript的事件循环机制

 更新时间:2022年03月18日 10:01:51   作者:程序猿布欧  
前端开发的童鞋应该都知道,JavaScript是一门单线程的脚本语言,这就意味着JavaScript 代码在执行的时候,只有一个主线程来执行所有的任务,同一个时间只能做同一件事情,这篇文章主要给大家介绍了关于JavaScript事件循环机制的相关资料,需要的朋友可以参考下

前言

JavaScript是一门单线程的弱类型语言,但是我们在开发中,经常会遇到一些需要异步或者等待的处理操作。

类似ajax,亦或者ES6中新增的promise操作用于处理一些回调函数等。

概念

在JavaScript代码执行过程中,可以分为同步队列和异步队列。

同步任务类似我们常说的立即执行函数,不需要等待可以直接进行,可以直接进入到主线程中去执行,类似正常的函数调用等。

异步队列则是异步执行函数,类似ajax请求,我们在发起的过程中,会进入到一个异步队列,加载到任务当中时,需要进行等待,之后才能进行返回值的处理。

举个栗子

下面一段代码,我们可以先了解一些一些关于事件循环机制的一些基本的原理

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

我们将代码打印到控制台当中,输出结果是:1,5,2,3,4

我们知道,在JavaScript中,类似定时器,以及ES6新增的promise是异步函数,回到我们上面所说的队列的概念当中,不难得出,1和5为同步执行队列

在执行完同步队列中的代码之后,再执行异步队列中的代码。

TIP

在解析异步队列的promise和定时器中,我们发现,定时器setTimeout是后执行于promise,这里我们引入JavaScript规范中的宏任务(Macro Task)和微任务(Micro Task)的概念

在JavaScript中,宏任务包含了:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 环境)

微任务:Promise、MutaionObserver、process.nextTick(Node.js 环境)

再回到上面的定时器和promise的问题,这时候我们知道,JavaScript中,当有异步队列的时候,优先执行微任务,再执行宏任务

再次举个栗子

假如在异步队列当中存在异步队列时,我们需要怎么处理

console.log(1);
setTimeout(function() {
  console.log(5);
}, 10);
new Promise(resolve => {
    console.log(2);
    resolve();
    setTimeout(() => console.log(3), 10);
}).then(function() {
    console.log(4);
})
console.log(6);

将代码执行到控制台中,得出的打印顺序是:1,2,6,4,5,3

  • 不同于例子1当中的promise,打印2是优先于6执行的,由此我们可以知道,new Promise在执行过程中,在未执行resolve或者rejected前,所执行的代码均为同步队列中的代码。
  • 再看4,5,3的执行顺序,在执行微任务promise执行回调resolve之后,对应的then立即执行
  • 在打印结果中,定时器5优先执行于—->属于微任务promise中的宏任务定时器3,定时器5这个宏任务是在promise微任务这个队列之后就加进去,在promise执行完成then回调之后,promise中的宏任务才加入到队列当中,因此在定时器5之后执行

总结

在JavaScript中,宏任务包含了:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 环境)

微任务:Promise、MutaionObserver、process.nextTick(Node.js 环境);

在执行过程中,同步代码优先于其他任务队列中的代码,

定时器,promise这类任务,在执行过程中,会先加入队列,

在执行完同步代码之后,再根据宏任务和微任务的分类,先执行微任务队列,再执行宏任务队列。

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

相关文章

  • JavaScript制作简单计算器功能

    JavaScript制作简单计算器功能

    这篇文章主要为大家详细介绍了JavaScript制作简单计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • H5跳转小程序按钮不显示(wx-open-launch-weapp)踩坑指南

    H5跳转小程序按钮不显示(wx-open-launch-weapp)踩坑指南

    这篇文章主要给大家介绍了关于H5跳转小程序按钮不显示(wx-open-launch-weapp)踩坑的相关资料,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • 理解javascript中的严格模式

    理解javascript中的严格模式

    这篇文章主要帮助大家理解javascript中的严格模式,何为严格模式,如何启用严格模式,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • JavaScript内置日期、时间格式化时间实例代码

    JavaScript内置日期、时间格式化时间实例代码

    JS中的 Date 对象用于处理日期和时间,Date对象和Math对象不一样,Date是一个构造函数,需要实例化后才能使用对象中具体的方法和属性。这篇文章主要给大家介绍了关于JavaScript内置日期、时间格式化时间的相关资料,需要的朋友可以参考下
    2021-05-05
  • JS设计模式之命令模式概念与用法分析

    JS设计模式之命令模式概念与用法分析

    这篇文章主要介绍了JS设计模式之命令模式概念与用法,简单描述了命令模式的原理、功能并结合javascript实例形式分析了命令模式相关定义与使用技巧,需要的朋友可以参考下
    2018-02-02
  • js实现人才网站职位选择功能的方法

    js实现人才网站职位选择功能的方法

    这篇文章主要介绍了js实现人才网站职位选择功能的方法,涉及javascript动态操作页面元素结点的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • JavaScript使用html2canvas实现截取HTML并生成图片

    JavaScript使用html2canvas实现截取HTML并生成图片

    在前端开发中,有时我们需要将网页的一部分或整个页面截取并保存为图片,这在生成报告、分享内容或保存用户界面状态等场景中非常有用,本文将介绍如何使用 JavaScript 库 html2canvas 来实现这一功能,并提供一个完整的示例,需要的朋友可以参考下
    2024-10-10
  • javascript循环链表之约瑟夫环的实现方法

    javascript循环链表之约瑟夫环的实现方法

    这是一道比较经典的循环链表问题,在华为上机笔试中也出现过。 约瑟夫环是一个数学的应用问题,下面这篇文章主要就给大家介绍了javascript循环链表之约瑟夫环的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 微信小程序实现action-sheet弹出底部菜单功能【附源码下载】

    微信小程序实现action-sheet弹出底部菜单功能【附源码下载】

    这篇文章主要介绍了微信小程序实现action-sheet弹出底部菜单功能,结合实例形式分析了action-sheet组件弹出菜单的使用技巧,包括元素遍历、事件响应及属性设置等操作方法,并附带源码供读者下载参考,需要的朋友可以参考下
    2017-12-12
  • 原生js实现下拉框功能(支持键盘事件)

    原生js实现下拉框功能(支持键盘事件)

    本文主要分享了原生js实现下拉框(支持键盘事件)功能的示例代码。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论