JS面试之对事件循环的理解

JS面试之对事件循环的理解

事件循环是 JavaScript 事件模型的核心,对于理解 JavaScript 的异步编程至关重要。事实上,事件循环是 JavaScript 成功的关键之一。

什么是事件循环?

JavaScript 是一种单线程编程语言。它有且只有一个主线程,因此只能同时执行一个任务。

事件循环是 JavaScript 异步编程的解决方案之一,它通过一种机制来实现 JavaScript 中的异步操作。

事件循环机制如下:

1. 所有同步任务在主线程中执行,形成一个执行栈。

当你的 JavaScript 代码执行时,所有的代码都在主线程上运行,并形成了执行栈。

2. 除了执行栈,还存在一个任务队列(task queue)。

JavaScript 引擎还维护了一个任务队列,用于存储不会立即执行的任务,也就是异步任务

3. 当一个异步任务完成时,它会被添加到任务队列中。

当一个异步任务完成时,它会被添加到任务队列中,等待执行。

4. 等待同步任务执行完毕后,主线程会查看任务队列是否有任务需要执行。

当主线程执行完所有同步任务后,它会查看任务队列并执行相应的任务。如果队列中没有任务,则继续等待异步任务完成。

5. 重复以上步骤。

主线程不断地重复执行以上步骤,实现异步操作。

示例

1. setTimeout

console.log('start');

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

console.log('end');

在这个示例中,第一个同步任务是 console.log('start'),它会在执行栈中执行。然后,引擎遇到 setTimeout,它将被添加到任务队列中,因为它是一个异步任务。接下来,又有一个同步任务 console.log('end'),它也会立即执行。当执行栈中的所有同步任务执行完毕后,引擎就会再次查看任务队列并执行相应的任务。在这个例子中,它会执行 setTimeout 回调函数的代码,即输出 "setTimeout"。

因此,上述代码的输出如下:

start
end
setTimeout

2. Promise

console.log('start');

new Promise(function(resolve) {
  console.log('Promise');
  setTimeout(function() {
    resolve();
  }, 0);
}).then(function() {
  console.log('then');
});

console.log('end');

在这个示例中,我们创建了一个 Promise 对象,并将其传递给一个函数。当这个 Promise 被创建时,它的构造函数会立即执行,并在执行栈中执行,输出 "Promise"。接着,它遇到了一个异步任务 setTimeout,通过添加回调函数实现了异步操作,在异步任务中调用 resolve,表示 Promise 执行成功。由于 Promise 的一个特性是,它能够异步地通知 Promise 的状态变化,因此当 Promise 的状态变成 fulfilled(执行成功)后,它会将相关回调函数添加到微任务队列中。然后,我们执行同步任务 console.log('end')

当执行栈中的所有同步任务执行完毕后,引擎查看任务队列并执行相应的任务。首先,它在微任务队列中找到了 Promise 的 then 回调函数,并将其添加到执行栈中。

因此,上述代码的输出如下:

start
Promise
end
then

总结

事件循环是 JavaScript 异步编程的核心机制,它通过一种任务队列机制实现了异步操作。了解事件循环机制,有助于我们更好地理解 JavaScript 异步编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS面试之对事件循环的理解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 通过JS动态创建一个html DOM元素并显示

    创建一个HTML DOM元素是非常方便的,Javascript提供了多种方法来实现这个目标。 一、使用document.createElement() 可以使用document.createElement()方法来创建任何HTML元素。例如,要创建一个<div>元素,您可以使用以下代码: // 创建一个 div 元素 const divEleme…

    JavaScript 2023年6月10日
    00
  • JavaScript中判断两个字符串是否相等的方法

    要判断两个字符串是否相等,可以用JavaScript中的几种方法。下面是几种常见的方法: 方法一:使用严格相等运算符(===) 使用严格相等运算符可以比较两个字符串是否完全相等,包括字符、大小写和顺序。代码示例如下: let str1 = "Hello World"; let str2 = "Hello World";…

    JavaScript 2023年5月28日
    00
  • js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)

    当我们需要将时间戳转换为特定格式的日期时间字符串时,我们可以使用 JavaScript 中内置的 Date 对象来进行处理,然后使用字符串模板 (template string)即可实现。以下是将时间戳转换为 yyyy-MM-dd hh:mm 格式的完整攻略。 1. 创建 Date 实例 首先,我们需要通过 Date() 构造函数创建一个 Date 实例,构…

    JavaScript 2023年5月27日
    00
  • 详解JSP 内置对象request常见用法

    详解JSP 内置对象request常见用法 1. request对象介绍 JSP内置对象request代表了一个HTTP请求,包含了客户端上所有的请求信息。当客户端发出请求,服务器就会创建一个request对象,并且request对象会一直存在于整个HTTP请求的生命周期中。request对象可以用来获取HTTP请求的参数,以及在服务器端保存和获取数据。 2…

    JavaScript 2023年6月11日
    00
  • javascript加号”+”的二义性说明

    当我们在JavaScript中使用加号 + 时,它具有两种不同的作用:数学加法和字符串拼接。这种情况被称为“加号的二义性”。 数学加法 当加号 + 作为两个数字之间的运算符使用时,它执行数学加法操作: const num1 = 5; const num2 = 10; const sum = num1 + num2; console.log(sum); // …

    JavaScript 2023年5月28日
    00
  • 利用js将ajax获取到的后台数据动态加载至网页中的方法

    为了将ajax获取到的后台数据动态加载到网页中,我们可以使用JavaScript来完成以下步骤: 创建XMLHttpRequest对象 我们首先需要创建一个XMLHttpRequest对象,该对象可以向后端服务器发送请求并接收响应。我们可以使用XMLHttpRequest.open()函数来指定请求的方式(GET或POST)、URL以及异步标志位。可以使用X…

    JavaScript 2023年6月11日
    00
  • javascript使用Promise对象实现异步编程

    首先我们来简单了解一下什么是Promise对象。Promise是Javascript中一种处理异步操作的对象,它代表了一个异步操作最终完成或失败的状态,可以取代Javascript中的回调函数,降低回调函数地狱和提高程序可读性。 接下来,我们将介绍如何使用Promise对象实现异步编程,过程中会给出两条示例说明。 1.定义Promise对象 我们首先需要定义…

    JavaScript 2023年6月10日
    00
  • JS中实现浅拷贝和深拷贝的代码详解

    浅拷贝和深拷贝是JavaScript中常用的两种复制对象的方法,两者的差别在于复制后对象所指向的地址是否相同。如果新生成的对象与原对象的内存地址相同,我们就称为浅拷贝;如果新生成的对象与原对象的内存地址不同,那么就称为深拷贝。 浅拷贝的实现 浅拷贝可以通过Object.assign()方法、扩展操作符或者遍历实现: Object.assign()方法实现浅拷…

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