setTimeout(fn, 0) requests a minimum, not an instant
The common read: setTimeout(fn, 0) runs the callback at the zero-millisecond mark, essentially "now"
You already know what a parked task waits for. Name it before reading on: the last lesson's model depends on it.
setTimeout passes its number to the runtime as a countdown, not as a position in the queue. That countdown runs outside the call stack, which is why it can finish while the stack is still running your synchronous code. Finishing the countdown does one thing: it makes the callback eligible to run, and eligible work parks in the task queue, where any other ready work waits.
The stack has to run to completion and become empty before the loop checks that queue. So a callback can wait there, ready to run, for as long as the running code takes, whether that code is a tight loop or a slow synchronous parse. The delay you pass states when the countdown ends, not when the callback runs.
Read "0" the same way as any other delay: as a minimum. setTimeout(fn, 0) means "make this eligible as soon as possible", and the callback still cannot run until the code already running has finished.

