前言
就像我们平时排队买早餐,如果你只是需要意见做好的包子油条,店家可以马上给你,你拿着就走了。但如果你需要特质的炒粉炒饭,店家不能马上给你,需要现炒。那么店家会给你一个号码牌,让你到旁边等待,让后面的人跟上。
类比js的执行,买包子油条就像js中的同步任务,可以马上执行。买炒粉就像js中的异步任务需要先被挂起。当炒粉好了,就相当于我们异步任务有返回,会被加入我们的事件队列。当我们执行栈被清空的时候,会读取事件队列中异步任务进主线程执行。
首先我们看下面一段代码
这段代码打印的结果为:
那么,为什么会出现这样的结果呢?
我们的js引擎是从上往下执行的,首先就会执行
第一步相信我们都能看明白,那么问题来了,为什么第二个执行的是console.log("Hi,仙女!")这个呢?
原因
当程序调用外部的 API 时(比如 ajax、setTimeout 等),会将此类异步任务挂起,继续执行执行栈中的任务。等异步任务返回结果后,再按照顺序排列到事件队列中;