JavaScript является однопоточным, что означает, что он не может использовать преимущества многопоточности, которые мы получаем с JAVA, C#, Python и т. д. Нам не предоставляется возможность запускать несколько процессов одновременно, вместо этого мы получаем один поток для запуска всех наших процессов.
Javascript — это однопоточный язык. Это означает, что у него есть один стек вызовов и одна куча памяти. Как и ожидалось, он выполняет код по порядку и должен завершить выполнение фрагмента кода, прежде чем переходить к следующему. Это синхронно, но иногда это может быть вредно. Например, если функция требует некоторого времени для выполнения или должна чего-то ожидать, она тем временем все замораживает.
Хорошим примером этого является функция оповещения окна. оповещение("Привет, мир")
Вы вообще не сможете взаимодействовать с веб-страницей, пока не нажмете «ОК» и не отклоните предупреждение. Вы застряли.
Ключевые понятия цикла событий, которые необходимо понимать
1. Стек обратного вызова
2. Очередь
Стек вызовов отслеживает порядок выполнения функций.
Изображение А
function a() { return "a" }function b() { return a() }function c() { return b() } c()
Изображение Б
Stack c() b() a()
Например, посмотрите на два изображения прямо выше. Изображение A — это ваш код, а изображение B — стек или порядок, в котором выполняются функции. Если бы вы запускали код на картинке A, функции выполнялись бы как на картинке B, причем c() запускалась бы первой, а a() — последней.
Очередь
Очередь — это список сообщений, которые должны быть обработаны, когда придет время. Подумайте о setTimeout() и асинхронных обратных вызовах.
function a() { console.log("This is function a") }function b() { setTimeout(function () { console.log('this is function b') }, 1000) a() }function c() { console.log("This is function c") b() } c()
Изображение C
This is function c This is function a This is function b
Изображение D
Если бы код на картинке C был выполнен, вы бы получили результаты, показанные на картинке D.
Что такое циклы событий?
Цель цикла событий — просмотреть стек вызовов и очередь. Когда стек пуст, он берет первое в очереди и выполняет его. В примере, который я привел выше со ссылкой на очередь, подумайте о том, как «Это функция A» регистрируется перед «Это функция B». Это связано с тем, что setTimeout() устанавливает таймер при регистрации «Это функция B», эффективно помещая его в очередь и позволяя функции A выполняться. Затем цикл событий увидел, что стек вызовов в этом примере пуст, поместил в стек первое, что было в очереди, это была функция «В», а затем выполнил ее.