Что вызывает запуск JavaScript-кода?

Если вы не знаете, о чем я говорю, прочитайте John Resig - как работают таймеры JavaScript и Является ли JavaScript гарантированным однопоточным?

Существует несколько триггеров, которые запускают задачи в исполнении JS-движков FiFo. Это не является частью какого-либо стандарта, поэтому я пытаюсь найти исчерпывающий список этих триггеров. (Я думаю, что все это сводится к внутренним обработчикам событий, например, к событиям загрузки script или событиям таймера, но я предпочел бы игнорировать внутренности ядра и смотреть на вещи с точки зрения пользователя.)

До сих пор я идентифицировал

  • <script> элементы в исходном документе (включая те, которые добавлены document.write) *
  • <script> элементы, вставленные JS во время выполнения *
  • Обработчики событий
    - они включают в себя широкий спектр случаев, таких как взаимодействие с пользователем, события ошибки, сообщения веб-рабочих или обратные вызовы Ajax...
  • window.setTimeout
  • window.setInterval

*) только в средах браузера /DOM

Больше? Любые различия между двигателями JS?

Ответ 1

"JavaScript" как имя языка не должен использоваться слишком широко.

ECMAScript - это то, о чем вы говорите. Вы можете найти информацию о ECMAScript в http://www.ecmascript.org/ Стандарт языка называется ECMA-262 с версией 5.1, поддерживаемой большинством браузеров.

setTimeout, setInterval, события DOM и т.д. не являются частью языка. Они предоставляются хост-средой как объекты-хосты. Написание ECMAScript для широкого круга среды хоста должно проявлять особую осторожность при использовании объектов хоста.

Код ECMAScript выполняется в контексте выполнения. Это принимает форму стека и будет удерживать состояние текущего контекста выполнения вверху.

Существует 3 способа продвижения контекста выполнения. Глобальный код, eval и функция. Это единственный способ запустить код. Хост-среды будут использовать эти методы для выполнения кода.

Хост-среда может предоставлять стек вызовов. Это используется для суммирования вызовов функций, генерируемых объектами хоста, которые могут выполняться в независимых потоках. Обычно событие, такое как setTimeout, добавляет функцию в стек вызовов. Хост-среда будет ждать до тех пор, пока стек контекста выполнения не будет пуст, а затем вытащите функцию из стека вызовов, создайте новый контекст выполнения, выполните код до завершения. Он повторит это до тех пор, пока стек вызовов не станет пустым.

Попытка создать полный список контекстных менеджеров выполнения объектов хоста бесполезна.

Чтобы ответить на вопросы.

Больше? Да, есть еще много. Это выходит за рамки этого ответа. Обратитесь к конкретной среде хоста, которую вы хотите использовать.

Любые различия между двигателями JS? (Среды хоста ECMAScript). Да. Опять же это выходит за рамки этого ответа и зависит от хоста

Есть несколько десятков хост-сред, с новыми, создаваемыми все время. То, что запускает создание нового контекста выполнения, сильно зависит от среды хоста.