详解JS事件循环及宏任务微任务的原理

yizhihongxing

让我们来详细讲解JavaScript事件循环及宏任务和微任务的原理。

什么是JavaScript事件循环

JavaScript事件循环是一种执行JavaScript代码的机制,它负责管理执行栈,并且从任务队列中获取任务。事件循环是JavaScript运行时的一个重要组成部分,同时JavaScript的异步执行正是基于事件循环实现的。

事件循环的执行过程

事件循环的执行过程可以分为以下几个步骤:

  1. 将同步任务压入执行栈中,依次执行;
  2. 执行过程中,如果遇到异步任务,将其挂起,并加入任务队列中;
  3. 同步任务执行完成后,事件循环开始执行任务队列中的任务;
  4. 从任务队列中取出一个任务,如果该任务是一个宏任务,则将其加入到执行栈中并执行;
  5. 如果是一个微任务,则执行该任务;
  6. 一次循环执行完所有的任务,开始下一次循环。

宏任务和微任务

JavaScript中的任务可以分为两种类型:宏任务和微任务。

宏任务是指在JavaScript主线程上执行的任务,包括但不限于setTimeout/setInterval、setImmediate、I/O操作等。宏任务的执行顺序是按照它们被创建的顺序排列的。

微任务是指在宏任务执行过程中被添加到任务队列中的任务。微任务包括Promise中的回调函数、MutationObserver、process.nextTick等。微任务的执行顺序是在当前宏任务执行结束后立即执行。

任务队列和优先级

事件循环的任务队列可以被分为多个不同的队列。不同队列之间的优先级不同。其中,每个宏任务有自己的队列,微任务也有一个独立的队列,在宏任务执行结束时,会立即执行它们。

以下是两个示例:

示例一:setTimeout与Promise回调

console.log('1');

setTimeout(function() {
  console.log('2');
}, 0);

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

console.log('4');

输出结果为:

1
4
3
2

解释:首先,打印出1。然后,执行setTimeout,将其加入宏任务队列中。接着,调用Promise.resolve(),将其加入到微任务队列中。执行console.log('4'),打印出4。然后,同步任务执行完毕,开始执行微任务队列中的任务,输出3。最后,事件循环开始执行宏任务队列中的任务,输出2。

示例二:MutationObserver

var observer = new MutationObserver(function(mutations) {
  console.log('mutations');
});

observer.observe(document.body, {
  attributes: true
});

document.body.setAttribute('class', 'test');

输出结果为:mutations

解释:首先,创建MutationObserver对象,并将其加入到微任务队列中。然后,执行document.body.setAttribute('class', 'test'),触发MutationObserver的回调函数,输出mutations。

结论

JavaScript的事件循环机制以及宏任务和微任务的概念都是很重要的。我们需要深入了解它们,以了解JavaScript的异步执行机制和实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS事件循环及宏任务微任务的原理 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript自学笔记(必看篇)

    JavaScript自学笔记(必看篇)攻略 1. 基本语法 JavaScript作为一门脚本语言,语法相对灵活,但是也需要遵循一定的规范。想要快速上手JavaScript,我们需要先掌握以下几个基本概念: 变量定义和赋值 数据类型 运算符 条件语句和循环语句 举个例子,我们可以通过以下代码来定义一个变量并给它赋值: var name = "张三&q…

    JavaScript 2023年5月27日
    00
  • JavaScript 巧学巧用

    JavaScript 巧学巧用完整攻略 JavaScript 是一种脚本语言,具有广泛的应用场景,尤其在 Web 开发中独树一帜。掌握 JavaScript 不仅可以增加开发效率,还可以开发出更加炫酷、交互性更强的网站和应用。本文将为大家介绍 JavaScript 巧学巧用的攻略,包括常用的技巧和使用示例。 1. 事件监听 事件监听是 JavaScript …

    JavaScript 2023年5月18日
    00
  • JS动画定时器知识总结

    标题:JS动画定时器知识总结 正文: 1. 前言 在前端开发中,动画交互是一个很重要的部分。JS定时器作为动画交互的实现方式之一,在使用过程中存在着一些需要注意的点。本文将针对JS动画定时器进行一个总结,希望能对读者在动画交互的应用中提供一些帮助。 2. 定时器概念 在JavaScript中,有两种定时器:setInterval()和setTimeout()…

    JavaScript 2023年6月10日
    00
  • JavaScript中的slice()方法使用详解

    JavaScript中的slice()方法是操作数组和字符串的常用方法之一,通过调用slice()方法可以截取数组或字符串的一部分元素或字符,返回一个新的数组或字符串,而原来的数组或字符串不会发生改变。下面将对slice()方法的使用进行详细讲解。 slice()方法语法 slice()方法的语法如下: arr.slice([begin[, end]]) 其…

    JavaScript 2023年5月28日
    00
  • .NET中弹出对话框的方法汇总

    “.NET中弹出对话框的方法汇总”是一篇用于介绍在.NET环境下如何弹出对话框的攻略文章,下面将对这篇文章做一个详细的讲解,介绍其具体内容和所包含的示例。 概述 文章的第一部分介绍了.NET中弹出对话框的必要性和使用场景,并梳理了常用的几种对话框类型。 MessageBox 在第二部分中,文章详细地介绍了使用MessageBox弹出对话框的方法,并提供了多个…

    JavaScript 2023年6月11日
    00
  • Cookies 和 Session的详解及区别

    我来详细讲解一下“Cookies 和 Session的详解及区别”。 Cookies 和 Session的概述 Cookies:保存在客户端,并且数据较为小巧,可以通过浏览器修改; Session:保存在服务端,因此不太容易被攻击,并且能够存储较为敏感的用户信息。 Cookies和Session的使用 Cookies的使用 Cookies的使用主要有以下几个…

    JavaScript 2023年6月11日
    00
  • JS简单添加元素新节点的方法示例

    下面我来详细讲解“JS简单添加元素新节点的方法示例”的完整攻略。 什么是添加新节点? 在 JavaScript 中,向 HTML 文档中添加节点(节点就是 HTML 元素)的过程称为添加新节点。 添加新节点的方法 使用 JavaScript 可以轻松地添加新节点到 HTML 页面中。下面我们来看看两个添加新节点的示例方法。 方法一:appendChild()…

    JavaScript 2023年6月10日
    00
  • 利用Vconsole和Fillder进行移动端抓包调试方法

    利用Vconsole和Fillder进行移动端抓包调试,是移动端开发过程中非常重要的技能之一。这种方法可以帮助我们更快地定位和解决移动端页面的bug或性能问题,提高开发效率和用户体验。下面,我会详细讲解这种方法的完整攻略。 简介 Vconsole是一个基于web的移动端调试工具,可以方便快捷的在移动端进行日志输出、元素查找、网络请求、性能分析等操作。Fill…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部