ECMAScript:关于作业和作业队列的一些问题

时间:2018-05-16 14:09:10

标签: javascript ecmascript-6 specifications ecmascript-2017

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

这几天,我对工作和工作队列感到困惑。

以下是一些问题。

1:在ECMA-262中,有两种作业队列。一个是ScriptJobs,另一个是PromiseJobs。那么,女巫有偏好吗? 2:在ECMA-262中,只有RunJobs抽象操作的定义。我想知道RunJobs何时何地执行? 我在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元素在动态创建的执行上下文上执行?

  

℃。让nextQueue成为以实现定义的方式选择的非空作业队列。我摔倒   作业队列为空,结果是实现定义的。

来自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?

1 个答案:

答案 0 :(得分:5)

  

哪一个有偏好?

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

  

我想知道RunJobs执行的时间和地点?

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

  

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

因为HTML规范很奇怪。有关概述,请查看https://www.html5rocks.com/en/tutorials/speed/script-loading/load and execute order of scripts。细节可以在HTML5 processing model for script elements中找到,基本上是

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

是的,这完全使浏览器的ECMAScript队列模型无效。哪个也在Integration with the JavaScript job queue部分中明确说明。