Per the MDN description of dispatchEvent()
:
the event handlers run on a nested callstack: they block the caller until they complete, but exceptions do not propagate to the caller.
Since they block the caller until complete, they run synchronously.