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日

相关文章

  • JavaScript中eval和with语句如何影响作用域链的深度探索

    让我详细讲解一下“JavaScript中eval和with语句如何影响作用域链的深度探索”。 什么是作用域链 在深入探索eval和with语句影响作用域链之前,我们需要了解一下什么是作用域链。 作用域链是JavaScript中的一个重要概念,它是一种链式结构,用于描述变量和函数的可见性和访问性。当我们访问一个变量或函数时,JavaScript引擎首先在当前作…

    JavaScript 2023年6月11日
    00
  • javascript Prototype 对象扩展

    JavaScript 中的每个对象都具有关联的 prototype 对象,它是一个指向另一个对象的指针,其中包含一组有用的属性和方法,可以让我们轻松地将这些方法引用到任何对象上。通过使用原型扩展,我们能够将方法和属性添加到原型对象上,以便所有的对象(实例)都可以访问和使用它们。 一、原型继承原型继承是一种可以使用 JavaScript 的原型链接来实现的非常…

    JavaScript 2023年5月27日
    00
  • 用js实现用户注册功能

    下面是用JS实现用户注册功能的攻略,包括以下几个步骤: 1. 构建注册表单 首先,需要创建一个表单来让用户进行注册,表单中应该包括用户名、密码、邮箱等常见的注册信息,以及一个“提交”按钮。需要定义每个input的name属性,方便后续使用。示例代码如下: <form id="register-form"> <label …

    JavaScript 2023年6月10日
    00
  • JS实现拖拽的方法分析

    JS实现拖拽的方法分析 在Web开发中,拖拽是一种常见的交互方式。本文将介绍三种实现拖拽的方法。 HTML5 Drag and Drop API HTML5 Drag and Drop API是现代浏览器提供的原生拖拽功能,不需要引入任何第三方库。该API包含五个事件和三个属性,可以通过设置这些事件和属性来实现拖拽功能。 使用方法 将要拖拽的元素添加drag…

    JavaScript 2023年5月27日
    00
  • 原生JS实现拖拽图片效果

    以下是我详细讲解“原生JS实现拖拽图片效果”的完整攻略。 简介 在Web开发中,拖拽功能已经成为了很常见的一种交互方式。利用原生JS实现拖拽功能是我们必须掌握的技能之一。本攻略将会教你如何使用原生JS实现拖拽图片的效果,便于你在实际开发中适用。 实现步骤 1. HTML代码 首先,我们需要有一张图片,并在HTML中添加img标签。代码如下: <!DOC…

    JavaScript 2023年6月11日
    00
  • 如何在JavaScript中比较日期详解

    当我们需要在JavaScript中比较日期时,需要注意的是,日期是一个非常复杂的概念。我们必须要有一个清晰的日期表示,并要知道如何比较不同的日期。 为了在JavaScript中比较日期,我们可以通过以下步骤来实现: 1. 创建日期对象 首先,我们需要创建一个日期对象。有几种方法可以创建日期对象。其中之一是使用JavaScript的Date()构造函数来创建日…

    JavaScript 2023年5月27日
    00
  • 前端面试JavaScript高频手写大全

    下面是我对“前端面试JavaScript高频手写大全”的完整攻略: 理解面试手写题的重要性 在前端面试中,手写题经常出现。这类题目不仅考察了我们的语法基础能力,更是考察了我们的逻辑思维能力。因此,提前准备面试手写题可以帮助我们快速掌握JavaScript的基础语法和常见面试题目,并能在面试中游刃有余地回答问题。 建立自己的笔记库 我们可以看到,大部分的手写题…

    JavaScript 2023年5月28日
    00
  • js创建元素(节点)示例

    下面是关于JS创建元素(节点)示例的完整攻略。 1. 获取元素的父元素 在JS创建元素之前,首先要获取其父元素,即要将新创建的元素添加到哪个元素中。可以通过getElementById()方法获取父元素的引用。比如: let parent = document.getElementById(‘parent’); 其中,parent为获取到的父元素。 2. 创…

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