Javascript运行机制之Event Loop

让我来为您讲解Javascript运行机制之Event Loop的完整攻略。

什么是Event Loop

Event Loop(事件循环)是指在Javascript的运行期间,用于处理异步操作的一种机制。其中异步操作包括setTimeout、Promise、DOM事件等等。

当Javascript代码遇到异步操作的时候,会将其放入事件队列(Event Queue)中,等待执行。Event Loop则不断地监听主线程的调用栈和事件队列的状态,当调用栈为空时,才会将事件队列中的任务压入调用栈中执行。

过程分析

1.在主线程中,遇到一个宏任务(如同步代码、setTimeout等)时,它会立即进入调用栈中执行。

2.当遇到微任务(如Promise.then、process.nextTick等)时,它并不会立即进入调用栈中执行。而是被放到暂存区中,等主线程的调用栈为空时,再执行所有的微任务。

3.在执行宏任务、微任务中遇到其他宏任务或微任务时,同样按照上述的方式来处理。

4.不断重复执行上述步骤,直到事件队列中的所有任务都被处理完毕。

下面,我给出两个具体的示例说明:

示例一

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

运行上述代码后,会在控制台上输出"1"、"3"、"2"。原因是setTimeout被放入了事件队列中,当主线程调用栈为空时,才会将其放入调用栈中执行。

示例二

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

运行上述代码后,会在控制台上输出"1"、"2"、"5"、"4"、"3"。原因是:

1.执行"1"的打印,输出"1"。

2.创建Promise,并立即执行其内部的代码块,输出"2"。

3.将setTimeout所在的回调函数放入事件队列中,等待执行。

4.执行resolve,将Promise状态变成fulfilled,此时便触发了Promise中的.then方法注册的回调函数。

5.输出"4"。

6.当主线程调用栈为空时,开始执行微任务,将放在暂存区中的.then回调函数放入调用栈中执行。输出"3"。

结论

在Javascript的事件循环过程中,异步操作会被放到事件队列中。当主线程调用栈为空时,才会执行事件队列中等待执行的异步操作。其中,微任务的执行优先于宏任务,同一次事件循环中的微任务都会优先执行完毕,再执行宏任务。当一个宏任务执行结束后,下一个宏任务又需要等待上一个微任务全部执行完成后才能执行。而如果一个宏任务中又触发了新的异步操作,则新的异步操作将被挂起,等待主线程调用栈执行完毕后再被执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript运行机制之Event Loop - Python技术站

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

相关文章

  • JS实现从对象获取对象中单个键值的方法示例

    要从一个对象中获取单个键值,可以使用 JavaScript 的点(.)或中括号([])运算符。这两种方法可以通过 JavaScript 对象来访问属性值(键值)。 以下是其中一种实现方法: 方法一:使用点运算符获取单个键值 这是获取单个键值的最常见方法。可以通过将点运算符后跟键名称来引用对象中的特定键。示例如下: const object = { key1:…

    JavaScript 2023年6月10日
    00
  • JS实现探测网站链接的方法【测试可用】

    非常感谢您对该篇文章的关注和探究。本篇文章将详细介绍如何通过JS实现探测网站链接的方法。 前言 在现代Web开发中,许多应用程序都需要通过链接访问其他资源。尤其是在网站开发中,网站链接是非常常用的功能之一。那么如何通过JS实现对链接的探测呢?在本文中,我们将答疑解惑,为您提供一份可实践的完整攻略。 准备工作 为了实现探测链接的功能,首先需要准备一下所需的工具…

    JavaScript 2023年6月11日
    00
  • IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理

    针对IE6/IE7中JavaScript json提示缺少标识符、字符串或数字的问题,可以采取以下处理方法: 方法一:手动添加JSON对象 对于IE6/IE7等低版本浏览器来说,没有原生的JSON对象,需要手动添加JSON对象。我们可以使用下面的代码来添加JSON对象: if (!window.JSON) { window.JSON = { parse: f…

    JavaScript 2023年5月27日
    00
  • 解析JavaScript中的不可见数据类型

    首先我们需要了解JavaScript中的不可见数据类型。 JavaScript中有七种数据类型:Undefined、Null、Boolean、Number、String、Object和Symbol(ES6新增)。其中Undefined和Null可以称为“空数据类型”,因为它们只有一个值:undefined和null。但是这两个值在JavaScript的底层实…

    JavaScript 2023年6月10日
    00
  • JS对象创建的几种方式整理

    JS对象创建的几种方式整理的攻略如下: 1. 对象字面量方式 对象字面量方式是指直接使用 {} 创建对象,使用键值对的方式来描述对象的属性和属性值。示例如下: const person = { name: "Alice", age: 25, sayHi: function() { console.log("Hi, I’m &qu…

    JavaScript 2023年5月27日
    00
  • 详解js中常规日期格式处理、月历渲染和倒计时函数

    下面将为您详细讲解js中常规日期格式处理、月历渲染和倒计时函数的完整攻略。 常规日期格式处理 在JavaScript中,我们可以使用Date对象对日期进行处理。常用的日期格式处理函数包括getFullYear()、getMonth()、getDate()、getDay()等。这些函数用于获取年、月、日、星期几等常用日期信息。比如,我们可以使用以下代码获取当前…

    JavaScript 2023年5月28日
    00
  • js防抖函数和节流函数使用场景和实现区别示例分析

    JS防抖函数和节流函数是前端开发中常用的函数优化方法,可以有效提升页面性能和用户体验。它们的使用场景和实现区别如下: 防抖函数 防抖函数的作用是在函数触发频繁的情况下,限制函数执行的次数,确保函数在触发后的一定时间内只执行一次。 使用场景 防抖函数通常用于以下场景: 搜索框输入联想:用户在输入框中快速输入字符时,会触发搜索请求,而防抖函数可以限制请求发送的次…

    JavaScript 2023年5月28日
    00
  • elementui源码学习仿写el-collapse示例

    elementui源码学习是提高前端技能的重要途径之一,而仿写el-collapse示例则是学习elementui源码的一种方式。下面是详细的攻略,在实践中应当充分理解和熟悉每一个步骤。 准备工作 首先要准备好编程环境,推荐使用VS Code或WebStorm等开发工具。下载elementui源码,可以从GitHub上下载或者使用npm安装。首先安装elem…

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