返回

浏览器事件循环机制:深入理解面试题

前端

浏览器事件循环机制概述

在开始讨论具体的概念之前,我们先来概述一下浏览器的事件循环机制。

浏览器事件循环机制是一个不断循环的过程,它负责管理 JavaScript 代码的执行和任务的调度。它包括以下几个主要组成部分:

  • 执行栈
  • 消息队列
  • 微任务队列
  • 宏任务队列

执行栈

执行栈是一个先进后出(LIFO)的数据结构,它存储着正在执行的 JavaScript 代码。当一个 JavaScript 函数被调用时,它会被压入执行栈,然后依次执行。当函数执行完毕后,它会被从执行栈中弹出。

消息队列

消息队列是一个先进先出(FIFO)的数据结构,它存储着等待执行的任务。这些任务可能是来自各种来源,如用户交互、计时器、网络请求等。当一个任务被加入消息队列后,它会等待轮到它执行。

微任务队列

微任务队列也是一个先进先出(FIFO)的数据结构,它存储着等待执行的微任务。微任务是比宏任务更优先执行的任务,如 Promise 的解析、MutationObserver 的回调等。当一个微任务被加入微任务队列后,它会等待轮到它执行。

宏任务队列

宏任务队列是一个先进先出(FIFO)的数据结构,它存储着等待执行的宏任务。宏任务是比微任务优先级更低的任务,如 setTimeout、setInterval、script 标签的加载等。当一个宏任务被加入宏任务队列后,它会等待轮到它执行。

事件循环如何工作

浏览器事件循环机制的工作过程如下:

  1. 首先,浏览器会从执行栈中取出顶部的函数并执行它。
  2. 当函数执行完毕后,它会被从执行栈中弹出。
  3. 然后,浏览器会检查消息队列中是否有等待执行的任务。如果有,它会将任务取出并执行它。
  4. 当消息队列中的任务执行完毕后,浏览器会检查微任务队列中是否有等待执行的微任务。如果有,它会将微任务取出并执行它。
  5. 当微任务队列中的微任务执行完毕后,浏览器会检查宏任务队列中是否有等待执行的宏任务。如果有,它会将宏任务取出并执行它。
  6. 当宏任务队列中的宏任务执行完毕后,浏览器会重新开始从第 1 步执行。

理解面试题

现在,我们已经了解了浏览器事件循环机制的基本概念,就可以开始理解面试题中的常见问题了。

面试题 1:什么是单线程?

JavaScript 是单线程的,这意味着它一次只能执行一个任务。当一个 JavaScript 函数正在执行时,其他的 JavaScript 代码必须等待它执行完毕才能继续执行。

面试题 2:什么是异步?

异步是指任务不会立即执行,而是会被加入消息队列或微任务队列中等待执行。当轮到它们执行时,它们才会被执行。

面试题 3:什么是非阻塞?

非阻塞是指 JavaScript 代码的执行不会被其他任务阻塞。即使有其他任务正在执行,JavaScript 代码也可以继续执行。

面试题 4:事件循环是如何工作的?

事件循环是一个不断循环的过程,它负责管理 JavaScript 代码的执行和任务的调度。它包括执行栈、消息队列、微任务队列和宏任务队列。浏览器会从执行栈中取出顶部的函数并执行它,当函数执行完毕后,它会被从执行栈中弹出。然后,浏览器会检查消息队列中是否有等待执行的任务,如果有,它会将任务取出并执行它。当消息队列中的任务执行完毕后,浏览器会检查微任务队列中是否有等待执行的微任务,如果有,它会将微任务取出并执行它。当微任务队列中的微任务执行完毕后,浏览器会检查宏任务队列中是否有等待执行的宏任务,如果有,它会将宏任务取出并执行它。当宏任务队列中的宏任务执行完毕后,浏览器会重新开始从第 1 步执行。