seção
A Cozinha do Restaurante: Uma Analogia do Mundo Real
O event loop é o mecanismo do JavaScript para executar código, lidar com eventos e gerenciar operações assíncronas. Conforme definido no WHATWG HTML Living Standard, ele coordena a execução verificando filas de callbacks quando a call stack está vazia, empurrando tarefas enfileiradas para a pilha. Isso permite comportamento não bloqueante apesar do JavaScript ser single-threaded.
Imagine uma cozinha de restaurante movimentada com um único chef que só consegue cozinhar um prato por vez. Apesar dessa limitação, o restaurante atende centenas de clientes porque a cozinha tem um sistema inteligente:
A COZINHA DO JAVASCRIPT ┌─────────────────────────┐┌────────────────────────────────┐ │ TIMERS DA COZINHA ││ PICO DE PEDIDOS │ │ (Web APIs) ││ (Call Stack) │ │ ││ ┌──────────────────────────┐ │ │ [Timer: 3 min - sopa] ││ │ Cozinhando agora: │ │ │ [Timer: 10 min - assado]││ │ "sanduíche grelhado" │ │ │ [Aguardando: entrega] ││ ├──────────────────────────┤ │ │ ││ │ Próximo: "preparar salada"│ │ └───────────┬─────────────┘│ └──────────────────────────┘ │ │└────────────────────────────────┘ │ (timer pronto!) ▲ ▼ │ ┌──────────────────────────────┐ │ │ JANELA "PEDIDO PRONTO!" │ GERENTE DA COZINHA │ (Task Queue) │ (Event Loop) │ │ │ [sopa pronta] [entrega aqui]│ "Chef livre? ───────────────────►│ │ Aqui está o próximo pedido!" └──────────────────────────────┘ │ ▲ │ ┌───────────────┴──────────────┐ │ │ PEDIDOS VIP URGENTES │ └──────────────────────────│ (Microtask Queue) │ (VIP primeiro!) │ │ │ [empratamento] [guarnição] │ └──────────────────────────────┘Como isso mapeia para o JavaScript:
| Cozinha | JavaScript |
|---|---|
| Chef Único | Engine JavaScript (single-threaded) |
| Pico de Pedidos | Call Stack (trabalho atual, LIFO) |
| Timers da Cozinha | Web APIs (setTimeout, fetch, etc.) |
| Janela "Pedido Pronto!" | Task Queue (callbacks aguardando) |
| Pedidos VIP Urgentes | Microtask Queue (promises, alta prioridade) |
| Gerente da Cozinha | Event Loop (coordenador) |
O chef (JavaScript) só consegue trabalhar em um prato (tarefa) por vez. Mas os timers da cozinha (Web APIs) rodam de forma independente! Quando um timer dispara, o prato vai para a janela "Pedido Pronto!" (Task Queue). O gerente (Event Loop) verifica constantemente: "O chef está livre? Aqui está o próximo pedido!"
Pedidos VIP (Promises) sempre têm prioridade. Eles passam na frente dos pedidos regulares na fila.
TL;DR: O JavaScript é single-threaded, mas alcança concorrência delegando trabalho para APIs do navegador, que rodam em segundo plano. Quando terminam, os callbacks vão para filas. O Event Loop move callbacks das filas para a call stack quando ela está vazia.