O JavaScript é uma linguagem single thread, ou seja, possui apenas uma thread de execução e por isso depende de um mecanismo chamado Event Loop para coordenar a execução de operações assíncronas. Algumas realizadas em paralelo por recursos externos como Web APIs, outras simplesmente adiadas para depois que o código síncrono atual terminar.

Para entender como o Event loop funciona vamos entender rapidamente as seguintes estruturas utilizadas pelo JS:

Call Stack

Web APIs

Task queue