ECMAScript: некоторые вопросы о задании и очереди заданий

этот вопрос о спецификации ECMAScript (ECMA-262, 8-е издание)

В эти дни меня немного смущают Job и Job Queue.

Вот некоторые вопросы.

1: В ECMA-262 существует два вида очереди заданий. один 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 выполняется в контексте выполнения, созданном динамически?

в. Пусть nextQueue будет непустой очередью заданий, выбранной способом, определяемым реализацией. Если все очереди заданий пусты, результат определяется реализацией.

разветвлен из ECMA-262 RunJobs. Как спецификация HTML определяет способ, определяемый реализацией?

@Берги нравится это? 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?

person ENvironmentSet    schedule 16.05.2018    source источник
comment
Это должно прояснить youtube.com/watch?v=cCOL7MC4Pl0.   -  person Jared Smith    schedule 16.05.2018
comment
@JaredSmith Я уже видел это видео. Но со спецификацией js не было объяснений.. :( Я хочу знать со спецификацией js..   -  person ENvironmentSet    schedule 16.05.2018


Ответы (1)


Какой из них имеет предпочтение?

Ни один. В спецификации указано " Эта спецификация не определяет порядок, в котором обслуживаются несколько очередей заданий." Очереди — это всего лишь инструмент для указания того, что для каждой очереди задания выполняются в порядке FIFO.

Я хочу знать, когда и где выполняется RunJobs?

Это очень сильно зависит от реализации. В такой среде, как node.js, он будет вызываться при запуске процесса — это базовая формулировка цикла событий. Конечно, было бы больше очередей заданий, например. для таймеров или асинхронных операций ввода-вывода.

Почему элемент скрипта выполняется в контексте выполнения, созданном динамически?

Потому что спецификация HTML странная. Взгляните на https://www.html5rocks.com/en/tutorials/speed/script-loading/ или загружать и выполнять сценарии в порядке для обзора. Подробности можно найти в модели обработки HTML5 для элементов скрипта, что в основном идет

  • Когда элемент скрипта становится связанным (т.е. вставляется в DOM),
  • все подготовьте и загрузите (при необходимости) и проведите всевозможные проверки,
  • если элемент не имеет атрибута src и является классическим скриптом (не модулем) и не вставляется парсером,
  • затем "Немедленно выполнить блок сценария, даже если другие сценарии уже выполняются."

Да, это полностью аннулировало модель очереди ECMAScript для браузеров. Это также явно указано в разделе Интеграция с очередью заданий JavaScript.

person Bergi    schedule 16.05.2018
comment
› Очереди — это всего лишь инструмент для указания того, что для каждой очереди задания выполняются в порядке FIFO. это означает, что какие бы PromiseJob, ScriptJob и т. д. самые старые не выполнялись? - person ENvironmentSet; 16.05.2018
comment
@EnvironmentУстановите самое старое задание в очереди. Не порядок обслуживания очередей. - person Bergi; 16.05.2018
comment
можешь мне объяснить еще один? проверьте пожалуйста - person ENvironmentSet; 16.05.2018