浏览器的事件循环标准是由 HTML 标准规定的,而NodeJS中事件循环其实略有不同
每一个浏览器都至少有一个事件循环,一个事件循环至少有一个任务队列。循环指的是其永远处于一个“无限循环”中。不断将注册的回调函数推入到执行栈。
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
console.log('foo')
bar()
baz()
}
foo()
它的输出是

以上一段简单的JS代码,究竟是怎么被浏览器执行的?
首先,浏览器想要执行JS脚本,需要一个“东西”,将JS脚本(本质上是一个纯文本),变成一段机器可以理解并执行的计算机指令。这个“东西”就是JS引擎,它实际上会将JS脚本进行编译和执行.
v8引擎有两个非常核心的构成,
执行栈和堆。执行栈中存放正在执行的代码,堆中存放变量的值,通常是不规则的。
V8运行此代码时,会首先调用 foo()。 在 foo() 内部,会首先调用 bar(),然后调用 baz()
此时,调用栈如下所示:


调用 foo 时,第一个帧被创建并压入栈中,帧中包含了 bar 的参数和局部变量。 当 foo 调用 bar 时,第二个帧被创建并被压入栈中,放在第一个帧之上,帧中包含 bar 的参数和局部变量。当 bar 执行完毕然后返回时,第二个帧就被弹出栈(剩下 foo 函数的调用帧 )当foo调用baz时,和第二帧同理. foo也执行完毕然后返回时,第一个帧也被弹出,栈就被清空了。

1.微任务
这里说的微任务(microtasks)其实是一个统称,包含了两部分:
2.宏任务