ECMAScript 中 "set of ECMAScript execution contexts" 和 "execution context stack" 有什么区别

What difference between the "set of ECMAScript execution contexts" and "execution context stack" in ECMAScript

在 ecma262 中我们可以找到下一部分:

An agent comprises a set of ECMAScript execution contexts, an execution context stack, a running execution context, an Agent Record, and an executing thread. Except for the executing thread, the constituents of an agent belong exclusively to that agent.

什么是set of ECMAScript execution contextsset of ECMAScript execution contextsexecution context stack有什么区别?

What is the set of ECMAScript execution contexts?

这基本上意味着 "all execution contexts that exist"。

And what difference between set of ECMAScript execution contexts and execution context stack?

堆栈明确地是在执行代码时创建的执行上下文堆栈。随着函数的进入和退出,执行上下文堆栈在整个规范的许多地方都有条目被推送和弹出。

作为这种差异的一个例子,一个新的执行上下文将在异步函数最初运行时创建,然后在函数 returns 或等待某些东西时从堆栈中弹出。弹出后,它不再是堆栈的一部分并且异步函数被挂起,但只要该函数正在等待其他东西并且因此可以稍后被推回堆栈,它仍然存在,所以仍然是一部分"set of ECMAScript execution contexts".