代码
题目来源于前端面试题宝典
const foo = () => console.log('First')
const bar = () => setTimeout(() => console.log('Second'))
const baz = () => console.log('Third')
bar()
foo()
baz()
//最终输出 :First Third Second
原因分析
首先调用bar
这个箭头函数中,它有一个setTimeout
函数,该函数由WebAPI
提供,当回调推送至WebAPI
时,setTimeout
将从栈弹出。
接着foo
进入栈,输出结果,然后弹出
baz
被也进入栈,然后被调用,输出结果。
最后由于WebAPI
都已经拿走了setTimeout
函数,再放回去多没面子,所以要把回调函数推到任务队列,于是就形成了事件循环
现在栈为空,则把队列的第一个元素bar
推送入栈,输出Second