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

让我们来详细讲解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日

相关文章

  • 基于JS实现操作成功之后自动跳转页面

    下面我详细讲解一下“基于JS实现操作成功之后自动跳转页面”的完整攻略。 步骤一:编写触发跳转的函数 在JS中实现页面的跳转,通常需要我们编写一个函数,用来触发页面跳转的动作。先来看一个简单的示例代码: function jumpTo(url) { location.href = url; } 这是一个最简单的跳转函数,它只需要传入一个目标URL参数,即可实现…

    JavaScript 2023年6月11日
    00
  • vue3中router路由以及vuex的store使用解析

    Vue3是当前前端领域最流行的框架之一,它提供了一些重要的功能模块,如路由、状态管理等,允许我们轻松构建复杂的单页应用程序。在本篇文章中,我们将详细阐述Vue 3中Router路由以及Vuex的Store使用解析,从而帮助您快速掌握这些关键功能。 Router路由 安装和使用Router 首先让我们来介绍Vue 3中的Router路由,这是一个非常重要的功能…

    JavaScript 2023年6月11日
    00
  • 突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)

    本文将为大家讲解Javascript API扩展5中的其他扩展,包括应用缓存、服务端消息以及桌面通知,并进行详细的解释和示例说明。 应用缓存 应用缓存是一种使得Web应用能够离线运行的技术,它可以将一个Web应用及其资源文件缓存到本地,从而在用户离线时也能够访问应用。 使用应用缓存需要使用如下代码: <!DOCTYPE html> <htm…

    JavaScript 2023年5月27日
    00
  • JS获取屏幕高度的简单实现代码

    当我们需要获取浏览器窗口可视区域的高度时,可以使用JavaScript代码来实现。下面是获取屏幕高度的简单实现代码攻略: 1.通过window对象获取屏幕高度 我们可以通过window对象来获取浏览器窗口的高度。这里有一个简单的例子: var height = window.innerHeight; 其中,window.innerHeight属性用于获取浏览…

    JavaScript 2023年6月11日
    00
  • 零基础学习AJAX之AJAX的简介和基础

    零基础学习AJAX之AJAX的简介和基础 AJAX概述 AJAX(Asynchronous JavaScript And XML)指的是利用JavaScript的异步通信技术向后端服务器请求数据并更新页面的技术。它可以使页面部分刷新,而不是每一次都要刷新整个页面,从而增强了用户的体验。 AJAX的优点 减少了不必要的数据传输 优化了用户体验 减轻了服务器的负…

    JavaScript 2023年5月28日
    00
  • js根据json数据中的某一个属性来给数据分组的方法

    实现 JS 根据 JSON 数据中的某一个属性来给数据分组的方法,可以使用 Array.prototype.reduce() 方法和 object[key] 或 Object.assign() 来处理分组数据。 以下是具体步骤: 首先,使用 Array.prototype.reduce() 方法来遍历 JSON 数据,并将其分组为一个对象。 在 reduce…

    JavaScript 2023年5月27日
    00
  • JavaScript中几个重要的属性(this、constructor、prototype)介绍

    当我们学习JavaScript时,一定会接触到几个重要的属性:this、constructor、prototype。 this this 是 JavaScript 中非常重要的关键字,其指向的是当前函数执行上下文的对象。在不同的环境中,this 的指向也会不同。 在全局作用域中,this 指向的是 window 对象。 在函数中,this 的指向会根据函数的…

    JavaScript 2023年5月27日
    00
  • 整理的比较不错的JavaScript的方法和技巧第2/3页

    整理的比较不错的JavaScript的方法和技巧 箭头函数 箭头函数是 ES6 中的新特性,可以让你更方便地定义匿名函数。箭头函数拥有更短的语法,并且没有自己的 this、arguments、super 或 new.target 绑定。 示例代码: // 普通函数 function hello1(name) { console.log(‘Hello, ‘ +…

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