前言

就像我们平时排队买早餐,如果你只是需要意见做好的包子油条,店家可以马上给你,你拿着就走了。但如果你需要特质的炒粉炒饭,店家不能马上给你,需要现炒。那么店家会给你一个号码牌,让你到旁边等待,让后面的人跟上。

类比js的执行,买包子油条就像js中的同步任务,可以马上执行。买炒粉就像js中的异步任务需要先被挂起。当炒粉好了,就相当于我们异步任务有返回,会被加入我们的事件队列。当我们执行栈被清空的时候,会读取事件队列中异步任务进主线程执行。

首先我们看下面一段代码

console.log('Hello,仙女')

setTimeout(function callback(){
console.log("回调函数执行")
},3000)

console.log("Hi,仙女!")

这段代码打印的结果为:

什么是Event Loop_异步任务

那么,为什么会出现这样的结果呢?

我们的js引擎是从上往下执行的,首先就会执行

console.log('Hello,仙女')

第一步相信我们都能看明白,那么问题来了,为什么第二个执行的是console.log("Hi,仙女!")这个呢?

原因

当程序调用外部的 API 时(比如 ajax、setTimeout 等),会将此类异步任务挂起,继续执行执行栈中的任务。等异步任务返回结果后,再按照顺序排列到事件队列中;