Что такое Event Loop

Ответ

Event Loop — это механизм в JavaScript, который отвечает за выполнение кода, обработку событий и работу асинхронных операций. Он работает в однопоточной среде, но позволяет выполнять неблокирующие операции.

Как это работает:

  1. Синхронный код попадает в Call Stack и выполняется сразу.
  2. Асинхронные операции (setTimeout, fetch и т.д.) передаются Web API, а их коллбэки попадают в Callback Queue.
  3. Когда Call Stack пуст, Event Loop берет коллбэки из Callback Queue и помещает их в Call Stack для выполнения.
console.log('Start'); // 1. Синхронный код

setTimeout(() => {
  console.log('Timeout'); // 3. Асинхронный коллбэк
}, 0);

console.log('End'); // 2. Синхронный код
// Output: Start, End, Timeout

Микро- и макрозадачи:

  • Микрозадачи (Promise, process.nextTick) выполняются сразу после текущего таска.
  • Макрозадачи (setTimeout, setInterval) — в следующей итерации Event Loop.

Ответ 18+ 🔞

Да ты посмотри, что творится-то, блядь! Event Loop, сука, в JavaScript — это ж как диспетчер на ебучем вокзале, только для кода. Он тут всем заправляет, события разгребает, асинхронщину пасёт, и всё это в однопоточной среде, представляешь? Один поток, а дел — овердохуища!

Как этот цирк работает, ёпта:

  1. Код синхронный, простой — сразу на сцену, в Call Stack, и давай отрабатывай, без очереди. Главное — не задерживай.
  2. А вот какая-нибудь асинхронная поебень, вроде setTimeout или запроса на сервер — её сразу в бокс, к Web API: «Иди, погуляй, пока мы тут основное делаем». А её коллбэк — тот, что должен выполниться потом — идёт ждать своей участи в Callback Queue, как в очереди за колбасой.
  3. И вот когда наш Call Stack окончательно опустеет, выметется, Event Loop такой: «Ага, свободно!» — и начинает таскать коллбэки из этой очереди обратно на сцену, в Call Stack, на выполнение. По одному, сука, без паники!
console.log('Start'); // 1. Всё, приехали, сразу в лог!

setTimeout(() => {
  console.log('Timeout'); // 3. А ты постой, подожди, тебя ещё рано!
}, 0); // Ноль миллисекунд? Да похуй, всё равно в конец очереди!

console.log('End'); // 2. Следующий, давай быстрее!
// И что на выходе? Start, End, Timeout. Вот тебе и «ноль миллисекунд», хитрая жопа!

А тут ещё, блядь, подвох есть — задачи делятся!

  • Микрозадачи (Promise, process.nextTick) — это как внезапный VIP-клиент. Только текущий таск закончился, они сразу, без очереди, прёт: «Меня срочно!». Все остальные пусть подождут.
  • Макрозадачи (setTimeout, setInterval) — это уже народ попроще. Их Event Loop запустит только в следующем своём круге, в следующей итерации, когда снова очередь подойдёт.

Вот так и живём, блядь. Один поток, а бардак как на вокзале в час пик — но всё работает, потому что Event Loop, сука, всех построил и пасёт. Ёперный театр!