Событийный цикл (eventloop)
Событийный цикл обеспечивает параллельное выполнение кода в реальном времени, т. е. совместное выполнение синхронных событий JavaScript и обработку асинхронных задач браузера.
Без событийного цикла выполнение синхронного кода блокировалось бы до момента выполнения асинхронного.
Как работает событийный цикл?
JavaScript читает сверху вниз документ с кодом и отправляет объявленные функции в стэк вызова.
Callstack (стэк вызова)
Стэк вызова запоминает какие функции были вызваны, запоминает их порядок, выделяет под них память (в heap), затем отправляет их на выполнение в JavaScript интерпретатор.
- Функции попадают в стэк по принципу первый вошел, первый вышел (first come, first served).
- Стэк имеет ограничение на количество вызовов и зависит от объема памяти, используемого функциями.
После выполнения JavaScript-функции возвращаются стэком вызова тому кто их вызывал, а браузерные отправляются для выполнения в Web API
- Промисы (Promises)
- Cлушатели событий (eventListeners)
- setTimeout
- setInterval
- Запросы fetch и т.д.
Результат выполнения браузерных событий отправляется в очередь задач, которую иногда называют очередь колбеков.
Event queue (очередь задач)
Очередь задач организует поток выполненных событий Web API.
Очередь состоит из 2-ух других под-очередей:
Далее событийный цикл берет выполненные браузерные функции из очередь задачи и отправляет их в стэк вызова.
Дополнительно:
- Ивентлуп это среда выполнения и может иметь разное внутреннее устройство.
- Ивентлуп указывает на текущее место выполнения программы
- Ивентлуп это бесконечный цикл постоянно ожидающий на вход задачи