Skip to content

浏览器相关面试题汇总

什么是异步函数

js 是单线程语言,同一时间只能处理一个任务。如果请求得是后端,这个响应可能几秒之后才会响应,所以要先跳过这个任务,继续向下执行。这种等待主进程结束再执行的函数任务被称为异步函数。常见的异步函数有 async/awaitpromise定时器

什么是事件循环

废弃解释

因为 js 是单线程语言,他就好比一个人再工作,但是同一时间只能做一项工作任务,所以就产生了任务队列,需要将接下来的工作都放在任务队列里面编排,干完一项任务之后再进行下一项任务。

但是任务队列还会分成三种:主任务队列、微任务队列、宏任务队列,每种不同的任务类型会放在不同的任务队列中,同步代码从上到下,都会放在主任务队列中;异步函数,如seTimeoutsetInterval,属于异步任务,会放在宏任务队列;那么微任务呢,指的就是 Promise 通过.then()的回调。

任务的优先级为: 主任务队列 > 微任务队列 > 宏任务队列

javascript
setTimeout(
  // 宏任务
  () => {
    console.log('setTimeout')
  }
)

// 主进程
new Promise((resolve) => {
  console.log('Promise')
  resolve('成功了')
}).then(
  // 微任务
  (res) => {
    console.log(res)
  }
)

事件循环也叫消息循环,是浏览器主线程的工作方式。

在 浏览器中,每次循环,都会从消息队列中取出第一个任务执行,而其他线程则会在合适的时候将任务放在消息队列的末尾。

过去把消息队列简单的划分为宏任务和微任务,目前已无法满足浏览器复杂的环境,取而代之的是一种更加灵活的处理方式。

根据 W3C 的解释,每个任务都有自己的任务类型,同类型的任务都在同一个队列中,不同的队列有不同的优先级,在一次事件循环中,由浏览器决定取哪一个队列的任务。但浏览器必须有一个微任务队列,微任务队列的任务一定具有最高的优先级,必须优先调度执行。