JavaScript的ECMA-262规定了JS执行的特定行为,将JS的评估定义为一个“Agent”,它本质上是线程的抽象术语。所有主要浏览器的JS引擎都遵循这个规范,并且显然Node.js使用与Chromium相同的引擎。执行上下文堆栈(简化来说处理函数调用)被作用于代理,因此您无法在多线程环境中真正使用JS。这就是为什么Web Workers不能传递对象并使用structured clone的原因。事件循环的概念也在ECMA-262中定义,结合RunJobs()和Jobs and Job Queues的行为。工作队列也被作用于代理,因此它们不能处理多线程环境。 目前,在ECMA-262中,Promise是唯一使用作业队列的东西(Promise处理程序总是在新的tick中运行),但Node.js和浏览器大量使用事件循环进行IO操作。