js中什么是事件循环

原创
ithorizon 7个月前 (09-17) 阅读数 180 #Javascript

JavaScript中的事件循环

在JavaScript中,事件循环是一种处理程序执行、事件和消息分发的机制。由于JavaScript是单线程的,意味着它一次只能执行一个任务,事件循环机制允许JavaScript引擎在处理其他操作(如用户交互、IO操作等)的同时,保持响应性和执行其他代码的能力。

事件循环的工作原理

JavaScript的运行环境首要由以下几个部分组成:

  1. 调用栈(Call Stack):这是代码执行的地方,函数依次被推入栈中并执行。
  2. 事件队列(Event Queue):当异步事件出现时(例如,一个HTTP请求完成,或者定时器触发),相应的回调函数会进入事件队列等待执行。
  3. 事件循环:事件循环逐步地检查调用栈是否为空,如果为空,它就会从事件队列中取出第一个回调函数并将其推入调用栈执行。

宏任务与微任务

在事件循环中,任务被分为两种类型:宏任务(Macrotasks)和微任务(Microtasks)。

宏任务通常包括:脚本执行、定时器(setTimeout、setInterval)、用户交互事件(如点击、键盘事件)、IO操作等。

微任务则通常包括:Promise的回调、MutationObserver等。

事件循环的执行过程如下:

  1. 执行宏任务,并且在执行过程中如果遇到微任务,将其添加到微任务队列。
  2. 当前宏任务执行完毕后,立即执行所有微任务队列中的任务。
  3. 微任务队列清空后,事件循环会检查是否有下一轮的宏任务待执行,如果有,重复步骤1。

示例代码

// 以下代码展示了事件循环中宏任务与微任务的执行顺序

console.log('Script start');

setTimeout(function() {

console.log('setTimeout');

}, 0);

Promise.resolve().then(function() {

console.log('Promise 1');

}).then(function() {

console.log('Promise 2');

});

console.log('Script end');

// 输出导致:

// Script start

// Script end

// Promise 1

// Promise 2

// setTimeout

从上面的示例中可以看出,即使定时器被设置为0毫秒延迟,它仍然会在所有微任务执行完毕之后才被执行,这是出于定时器是宏任务,而Promise的回调是微任务。

总结

JavaScript的事件循环机制促使单线程的JavaScript能够执行错综的任务和保持高响应性。了解事件循环对于掌握异步编程非常重要,它可以帮助开发者编写出高效、合理的代码。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Javascript


热门