【问题标题】:ECMAScript : Some questions about Job and Job queueECMAScript:关于作业和作业队列的一些问题
【发布时间】:2018-10-26 15:26:40
【问题描述】:

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

这些天来,我对 Job 和 Job Queue 有点困惑。

这里有一些问题。

1:在ECMA-262中,有两种Job Queue。一个是ScriptJobs,另一个是PromiseJobs。那么,女巫一号有偏好吗?
2:在ECMA-262中,只有RunJobs抽象操作的定义。我想知道RunJobs 何时何地执行?
3.我在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。让 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?

【问题讨论】:

标签: javascript ecmascript-6 specifications ecmascript-2017


【解决方案1】:

哪一个有偏好?

两者都不是。规范states该规范没有定义服务多个作业队列的顺序。”队列只是一个工具,用于指定每个队列,作业是以先进先出的顺序执行。

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

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

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

因为 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 部分中明确说明。

【讨论】:

  • > 队列只是一种工具,用于指定每个队列中的作业按 FIFO 顺序执行。这意味着,无论 PromiseJobs、ScriptJobs 等。最旧的会执行吗?
  • @EnvironmentSet 每个队列最旧的作业。不是服务队列的顺序。
  • 你能再给我解释一下吗?请检查
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2017-03-11
  • 2013-05-08
  • 1970-01-01
相关资源
最近更新 更多