The Event Loop, Visualized
JavaScript has one thread and still handles a thousand concurrent sockets. The event
loop is how: a single thread that never blocks, a queue of ready tasks, and a strict
order for running them. This video animates the loop tick by tick — the call stack
emptying, the microtask queue draining, and I/O callbacks firing — so setTimeout vs.
Promise ordering becomes mechanics, not magic.
Topics covered:
- Why a single-threaded model can still serve I/O-heavy workloads
- The call stack and the "one thing at a time" execution rule
- The task queue: where macrotasks (timers, I/O, events) land
- The microtask queue: why promises always beat timers
- How libuv provides the underlying I/O thread pool and epoll loop
setTimeout(0)vs.queueMicrotask: the exact ordering- Blocking the loop: what a busy task does to every other callback
- Why the browser and Node schedule differently
Related articles
Event Loops vs Threads: How Concurrency Actually Gets Scheduled
Why one thread with non-blocking I/O beats ten thousand blocked threads, how epoll and kqueue do readiness checking, the event loop fairness problem, and Go's M:N scheduler.
Tail Call Optimization and Recursion: When the Stack Grows and When It Doesn't
How tail-position calls become jumps instead of calls, why C compilers only do it with optimization, why JavaScript engines tried and mostly stopped, and how trampolines fake TCO.
Boxing, Unboxing, and Value vs Reference Semantics
Why every boxed int is a heap allocation, why int[] beats ArrayList and Integer[] by 4-16x, how Java generics erasure forces boxing, and how C# structs avoid it.
More in Runtime & Execution
How Garbage Collection Actually Works
A visual walkthrough of mark-sweep, generational collection, and concurrent GC — the algorithms that keep your memory clean.
WatchWhat Your Code Does Before main()
The loader, the linker, the dynamic linker, and the runtime — everything that happens between pressing run and your first line of code.
WatchHow Threads Actually Work
The kernel scheduler, context switches, goroutines versus threads — a visual walkthrough of what 'running on a core' really means.
WatchAsync/Await Under the Hood
What async/await compiles to — state machines, continuations, and the executor — and how your async function actually runs on one or many threads.
DetailsVirtual Machines Explained
How language VMs like the JVM and the CLR work — bytecode verification, the execution engine, and the runtime services beneath your program.
DetailsInterpreters vs. Compilers
What an interpreter actually does at runtime versus what a compiler does before — ASTs, bytecode, and why the boundary keeps blurring.
DetailsReference Counting vs. Tracing GC
The two families of automatic memory management — refcounts, cycles, and ARC versus tracing collectors, roots, and reachability — compared on real trade-offs.
DetailsStack vs. Heap Memory
Where your variables actually live — the hardware stack's push and pop discipline versus the heap's malloc and free — and why the difference matters.
DetailsJIT Compilers Explained
How just-in-time compilers work — profiling, tiered compilation, and generating machine code at runtime — from interpreter to native in microseconds.
DetailsDepth, delivered weekly
One technical dispatch a week — articles and episode notes before they go public.
One technical dispatch per week. No noise.