Ответ
Event Loop — это механизм в JavaScript, который отвечает за выполнение кода, обработку событий и работу асинхронных операций. Он работает в однопоточной среде, но позволяет выполнять неблокирующие операции.
Как это работает:
- Синхронный код попадает в Call Stack и выполняется сразу.
- Асинхронные операции (setTimeout, fetch и т.д.) передаются Web API, а их коллбэки попадают в Callback Queue.
- Когда 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 — это ж как диспетчер на ебучем вокзале, только для кода. Он тут всем заправляет, события разгребает, асинхронщину пасёт, и всё это в однопоточной среде, представляешь? Один поток, а дел — овердохуища!
Как этот цирк работает, ёпта:
- Код синхронный, простой — сразу на сцену, в Call Stack, и давай отрабатывай, без очереди. Главное — не задерживай.
- А вот какая-нибудь асинхронная поебень, вроде
setTimeoutили запроса на сервер — её сразу в бокс, к Web API: «Иди, погуляй, пока мы тут основное делаем». А её коллбэк — тот, что должен выполниться потом — идёт ждать своей участи в Callback Queue, как в очереди за колбасой. - И вот когда наш 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, сука, всех построил и пасёт. Ёперный театр!