ECMAScript : 关于 Job 和 Job queue 的一些问题

ECMAScript : Some questions about Job and Job queue

这个问题关于 ECMAScript 规范(ECMA-262 第 8 版)

这些天,我对作业和作业队列有点困惑。

这里有一些问题。

1: 在ECMA-262中,有两种Job Queue。一个是 ScriptJobs 另一个是 PromiseJobs。那么,一个有偏好吗?
2:在ECMA-262中,只有RunJobs抽象操作的定义。我想知道 RunJobs 执行的时间和地点?
3.I 执行代码 blow,在 FF 60 中。

<!DOCTYPE html>
  <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <script>
        window.addEventListener('DOMContentLoaded', () => {
          let x = document.createElement('script');
          x.innerHTML = 'console.log(3);';
          console.log('script start');
          document.body.appendChild(x);
          setTimeout(() => console.log(1), 0);
          Promise.resolve(2).then(console.log);
          console.log('script is end');
        });
      </script>
    </head>
   <body>
   </body>
  </html>

并记录:

script start
3
script end
2
1

为什么 script 元素在动态创建的执行上下文中执行?

c. Let nextQueue be a non‐empty Job Queue chosen in an implementation‐defined manner. If all Job Queues are empty, the result is implementation‐defined.

从 ECMA-262 RunJobs 分叉。 HTML 规范如何定义 实现定义的方式?

@Bergi 喜欢这样吗? PromiseJobs:[],ScriptJobs:[]

ScriptJobs.push(something);   
// pop and run by Event loop   
// blow will happens while `something` runs 
PromiseJobs.push(anotherOne);
ScriptJobs.push(theother);     
//end of `something`    
//and in here, PromiseJobs will pop?

Which one have preference?

都没有。规范 states此规范未定义服务多个作业队列的顺序。”队列只是指定每个队列 的工具,作业以 FIFO 顺序执行。

I want to know when and where the RunJobs execute?

这在很大程度上取决于实施。在像 node.js 这样的环境中,它将在进程启动时调用 - 这是基本的事件循环公式。当然会有更多的工作队列,例如用于定时器或异步 IO 操作。

Why script element execute on execution context that created dynamically?

因为 HTML 规范很奇怪。看看https://www.html5rocks.com/en/tutorials/speed/script-loading/ or load and execute order of scripts for an overview. The details can be found in the HTML5 processing model for script elements,基本上是

  • 当脚本元素连接时(即插入到DOM),
  • 准备一切并加载它(如果需要)并进行各种检查,
  • 如果元素没有 src 属性并且是经典脚本(不是模块)并且未插入解析器,
  • 然后“立即执行脚本块,即使其他脚本已经在执行。

是的,这使浏览器的 ECMAScript 队列模型完全无效。这也在 Integration with the JavaScript job queue.

部分中明确说明