Javascript运行机制之Event Loop

yizhihongxing

让我来为您讲解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 易错知识点实例小结

    JavaScript 易错知识点实例小结 在编写 JavaScript 代码的过程中,会遇到一些易错的知识点,可能会导致出现预期外的结果,甚至是程序的崩溃。因此,我们需要了解这些易错知识点,并采取正确的措施避免这些问题的发生。在本文中,我们将详细讲解 JavaScript 易错知识点,并提供实例来帮助读者更好地理解。 目录 变量提升 this 关键字 闭包 …

    JavaScript 2023年6月10日
    00
  • java程序中的延时加载异常及解决方案

    Java程序中的延时加载异常及解决方案 什么是延时加载异常? 在Java程序中,经常会涉及到类的加载和实例化。通过类的加载,Java将.class文件中的字节码转换为JVM可以理解的结构(如Class对象);而实例化则是创建对象实例的过程。 在程序开发中,有时候需要在程序启动时直接加载所需类,但也有一些场景需要进行延时加载,也就是在程序运行时再加载类,这时就…

    JavaScript 2023年5月28日
    00
  • 基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)

    下面我来详细讲解一下基于JavaScript实现根据手机定位获取当前具体位置的完整攻略。 准备工作 获取用户地理位置授权。在JavaScript中,我们可以通过navigator.geolocation.getCurrentPosition()方法获取用户的当前位置信息。但是在获取位置信息之前,需要向用户请求获取他们的位置授权。用于请求授权的代码如下: “…

    JavaScript 2023年6月11日
    00
  • Js操作DOM元素及获取浏览器高宽的简单方法

    Js操作DOM元素及获取浏览器高宽的简单方法的攻略如下: 操作DOM元素 选择元素 在Javascript中,选择DOM元素是很重要的一步。有很多方法可以选择DOM元素,但是最常用的方法是使用document.querySelector和document.querySelectorAll这两个方法。 document.querySelector方法返回一个与…

    JavaScript 2023年6月10日
    00
  • asp.net 无刷新翻页就是这么简单

    下面我将为您详细讲解“ASP.NET 无刷新翻页就是这么简单”的完整攻略。 1. 安装 jQuery 插件 由于无刷新翻页和 jQuery 插件有关系,因此需要在页面中引用 jQuery 插件。可以在 jQuery 官网 上下载最新版的 jQuery 插件,然后将其引用到项目目录下,并在页面头部引入: <script src="jquery-…

    JavaScript 2023年6月11日
    00
  • JavaScript中for循环的几种写法与效率总结

    以下是详细的攻略: JavaScript中for循环的几种写法与效率总结 1. for循环基本语法 for (let i = 0; i < length; i++) { // 循环体 } 其中,let i = 0 表示初始化一个变量 i ,初始值为 0 ; i < length 表示循环条件,当 i 小于 length 时,执行循环体; i++ …

    JavaScript 2023年5月28日
    00
  • 让你5分钟掌握9个JavaScript小技巧

    下面我就来详细讲解“让你5分钟掌握9个JavaScript小技巧”的完整攻略。 1. 变量值交换 有一种交换变量值的另类写法,可以用解构赋值完成: let a = 1; let b = 2; [a, b] = [b, a]; console.log(a) //输出2 console.log(b) //输出1 2. 使用扩展运算符复制数组 扩展运算符(spre…

    JavaScript 2023年5月17日
    00
  • JS实现进度条顺滑版详细方案

    下面是JS实现进度条顺滑版详细方案。 方案概述 实现进度条顺滑版的方案,需要用到JS的定时器和CSS3的过渡效果,大致的流程如下: 获取进度条元素和进度值。 设置定时器,每隔一定时间(比如100毫秒)更新进度条的宽度,直到达到目标进度值。 在每次更新进度条的宽度时,为其添加过渡效果(transition),实现顺滑的动画效果。 具体实现 示例1:使用setT…

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