JavaScript — это однопоточный асинхронный язык программирования, то есть код JavaScript выполняется по одной строке за раз, и одновременное выполнение двух отдельных строк кода не имеет значения. Но, глубоко подумав, как обстоят дела с этой концепцией запуска задач в JavaScript, можно согласиться с тем, что это пустая трата времени, так как при выполнении программы на JavaScript будет много времени простоя обработки.
Чтобы позаботиться об этом, в JavaScript есть все необходимое, чтобы создать иллюзию того, что он работает в многопоточном режиме, но создание иллюзии не является целью. Цель состоит в том, чтобы достичь тех же возможностей, что и многопоточные языки.

Итак, представьте себе процесс достижения чего-то, где этот процесс разбит на куски, называемые функциями, и существует определенный маршрут, по которому эти функции для задачи должны следовать, чтобы добраться до завершения задачи. Задача исходит из веб-API, и ее функции проходят через определенные точки и возвращаются туда, откуда возникла задача. Чтобы задача была завершена, она должна завершить этот круг, где есть область ожидания для функций, прежде чем они начнут выполняться, и есть другая область, где эти функции спрятаны во время их выполнения. Маршрут, образующий круг, называется циклом событий, область ожидания перед началом выполнения функций называется очередью событий, а область, в которой хранятся выполняемые функции, называется памятью стека или стеком вызовов функций.

Позвольте мне сначала начать со стека вызовов функций. Вызываемые или выполняемые функции сохраняются или хранятся в памяти, вызывающей стековую память. Эта память ведет себя таким образом, что последняя поступившая функция будет первой полученной, а задача завершится выполнением.
Теперь очередь событий — это просто место, где функции, ожидающие выполнения, располагаются последовательно так, как они были инициированы из веб-API. Функция перемещается из очереди событий в стек, когда цикл событий обнаруживает, что стек пуст. Цикл событий — это не просто канал потока, он действует как контроллер, управляя тем, как функции перемещаются из одного места в другое, когда это необходимо. Цикл событий — это то, что помогает Java-скрипту работать так, как если бы он был многопоточным языком, или достигать сущности многопоточности.