Автор оригинала: Kevin Velasco.
TL; DR JavaScript действительно быстро работает. Он просит браузер (на самом деле многопоточье), чтобы выйти и делать вещи и рассказать JavaScript, когда это сделано. Двигатель Javscript затем доберутся до него, когда он ничего не делает.
Возможно, вы слышали из разных мест, которые JavaScript является однопоточным. Это означает, что он может выполнять только одну команду за раз (вид, как большая часть населения мужского пола на земле); Тем не менее, ваш опыт в Интернете обычно имеет 2-3 вещи, происходящие одновременно. Это может быть любая комбинация
- Получение данных с удаленного сервера
- Обработка пользовательского ввода
- Обработка сложных анимаций
- Рендеринг элементов пользовательского интерфейса
Итак, если все это происходит одновременно, как работает однопотоковый JavaScript Engine, заставляют все это произошло легко. Краткий ответ, Структура событий Отказ
Но во-первых, некоторые доказательства того, что JavaScript действительно не может сделать более одной вещи за раз. ПРЕДУПРЕЖДЕНИЕ: Это будет сбиваться одной из ваших вкладок или браузера. Быть готовым убить его
Если вы заходите в вашу консоль JavaScript в вашем браузере (вы можете Google, как это сделать) и вставить следующий код в ввод консоли
while(true){}
Вы обнаружите, что вы не можете нажать что-либо или прокрутить страницу. Это потому, что мы начали бесконечный цикл, который не очистит стек (объяснит это через несколько мгновений).
Хорошо, на хорошие вещи. Почти во всех программах есть два вида памяти, которые доступны для него: стек и куча
Стек
Стек представляет собой область в памяти, которая имеет некоторые специальные правила вокруг того, как данные могут быть добавлены или удалены. Он ведет себя аналогично блинами, которые вы видите выше. Стеки – это то, что мы называем конструкциями данных в последнюю очередь. Это означает, что последний набор данных, которые добавляются в стек, является первым, что удалено.
Если вы делали блины, как вы готовите их, вы перенесли их на тарелку. Вы найдете, что последний, который вы приготовили, это тот, кто находится сверху. Блин на вершине первой съеденной. Стек блин есть lifo (в последний раз, сначала).
Всякий раз, когда вы называете Функция
в Javscript, эта функция контекст
нажимается на стек. Если эта функция вызывает другую функцию, она добавлена или «нажата» в стек. Как функции Возвращение
Они будут удалены или «выпущены» из стека.
Когда стек пуст, двигатель JavaScript делает Ничего Отказ Помните это.
Когда стек пуст, JavaScript делает ничего такого
Куча
Куча – это то, где большинство данных в программе хранятся. Здесь живут такие вещи, как объекты и массивы. Не зная точно, где что-то в куче, мы бы не смогли получить доступ к нему. Если бы у нас было немного Игла Например, в куче, если мы хотели его использовать, нам нужно было точно знать, где оно (то есть у меня есть переменная к ней)
В куче есть структура данных, присутствующая в каждой программе JS под названием Очередь сообщений
Отказ Очередь сообщений действует как очереди, которые вы испытываете в повседневной жизни. Очередь – это FIFO (первым прибыл, первым обслужен).
Если бы вы были первыми в очередь для чего-либо, вы также будете удалены из очереди. Это верно для всех очередей, кроме тех в аэропортах.
Хорошо, у нас сейчас есть несколько штук:
- Стек в том, где контекст каждой функции, который вы звоните
- Куча – это где все большие данные живут
- Очередь сообщений является некоторой очереди, которая хранит сообщения (живет в куче)
Последний большой кусок – браузер API (в узле это было бы Система API). Для того, чтобы сделать что-либо с браузером, JavaScript должен иметь некоторые функции, доступные из браузера для выполнения действий. Некоторые примеры:
- принести
- сентиментальный
- ProwelsimationFrame.
- setinterval.
Всякий раз, когда вы называете эти API, обратный вызов зарегистрирован и в какой-то момент в будущем браузер позвонит этот обратный вызов.
setTimeout( function callback() { // run this code in 1 second }, 1000 )
Когда этот обратный вызов – называется Его контекст нажимается на очередь сообщений
Помните, когда я упомянул, что JavaScript делает Ничего Когда стек пуст? Всякий раз, когда JavaScript делает Ничего Некоторая волшебная машина возьмет следующую вещь из Очередь сообщений и подтолкнуть его на стек. Эта волшебная машина называется контур событий
Эта статья была вдохновлена большим разговором Уильяма Винсента на петле событий JavaScript. https://wsvincent.com/javascript-event-loop/. Изображение выше из его блога.