ECMAScript: некоторые вопросы о работе и очереди на работу - PullRequest
0 голосов
/ 16 мая 2018

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

В эти дни меня немного смущает работа и очередь на работу.

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

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 элемент выполняется в контексте исключения, который создан динамически?

c.Пусть 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?

1 Ответ

0 голосов
/ 16 мая 2018

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

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

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

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

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

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

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

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

...