Что такое Javascript?
однопоточный, неблокирующий, параллелизм и асинхронный язык. В Javascript есть стек вызовов, цикл событий, очередь обратного вызова, некоторые другие API и прочее. Он использует движок V8, разработанный Google и написанный на C++.

Есть ли в движке V8 стек вызовов, цикл событий, очередь обратных вызовов, какие-то другие API и прочее?
В движке V8 есть только стек вызовов и куча.

Стек вызовов

Стек вызовов — это структура данных, которая записывает в основном, где в программе мы находимся, если мы входим в функцию, мы помещаем что-то в стек, если мы возвращаемся из функции, мы выталкиваем вершину стека.

один поток == один стек вызовов == одна вещь за раз

Javascript — это однопоточный язык программирования, который означает, что он имеет один стек вызовов и может выполнять одно действие за раз, давайте разберемся с этим на примере ниже.

В приведенном выше фрагменте кода у нас есть несколько функций: функция умножения, которая умножает два числа, функция квадрата, которая дважды вызывает умножение на одно и то же число, функция, которая печатает квадрат числа вызывающего квадрата, а затем вызывает console.log, а затем внизу файла мы на самом деле запускаем печать квадрата.

Итак, если мы запустим этот файл, то получим некую основную функцию, как и сам файл, поэтому мы поместим ее в стек.

Затем у нас есть некоторые определения функций, они определяют состояние мира, и, наконец, мы получили квадрат печати, поэтому printSquare — это вызов функции, поэтому мы помещаем его в стек, и сразу внутри квадрата печати помещаем в стек, который вызывает умножение, теперь у нас есть оператор return, мы умножаем A и B и возвращаемся.

Когда мы возвращаемся, мы выталкиваем что-то из стека, поэтому, выталкиваем множитель стека, возвращаемся к квадрату, возвращаемся к печатному квадрату, console.log, возврата нет.

Блокировка
Блокировка означает, что что-то работает медленно, например сетевой запрос, запрос изображения и т. д.

Что происходит, когда все работает медленно?

Давайте разберемся с этим на примере

Допустим, у нас есть, это как поддельный кусок кода, getSynchronous как запрос Ajax. Что было бы, если бы это были синхронные запросы. Если мы пройдем через это, как мы сделали, мы вызовем getSync, а затем будем ждать, потому что выполнение сетевого запроса, запрос завершается, мы можем двигаться дальше, затем ждать, двигаться дальше.

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

Почему это проблема?
Проблема в том, что мы запускаем код в браузере. Поэтому, когда мы делаем какой-либо запрос в браузере, браузер блокируется, он зависает и ничего не может сделать, пока эти запросы не будут выполнены.
Итак, как мы справляемся с этим?
Ну, самое простое решение, которое нам предоставляется, — это асинхронные обратные вызовы, в браузере почти нет функции блокировки, равно как и в узле, все они сделаны асинхронными, что в основном означает, что мы запускаем какой-то код, даем ему обратный вызов и запускаем его позже.
Как это выглядит на самом деле?

Простой пример: сначала этот код выводит в console.log «Привет», мы запускаем setTimeout, но этот квест запрашивает журнал консоли на будущее, поэтому переходите к «Циклу событий», а через пять секунд мы записываем «Там».
Итак. в приведенном выше сценарии, как работают асинхронные обратные вызовы и стек вызовов?
«main», помещенный в журнал консоли стека, печатает «Hi», затем мы setTimeout не запускается немедленно, мы знаем, что он будет выполняться через пять секунд, когда мы можем' t помещаю его в стек, он каким-то образом исчезает, а затем «Цикл событий» и стек вызовов очищаются, и через пять секунд в консольном журнале появляется «Там».

Как это происходит? Как это исчезает и волшебным образом появляется через пять секунд?
Здесь идет речь о концепции параллелизма и цикла событий.
Как мы все знаем, JavaScript может делать только одну вещь за раз, это правда. javascript Runtime может делать только одну вещь за раз. Он не может сделать запрос ajax, пока вы работаете с другим кодом. Он не может установить время ожидания, пока вы делаете другой код.
Причина, по которой мы можем делать что-то одновременно, заключается в том, что браузер — это больше, чем просто среда выполнения.

Javascript Runtime может делать одну вещь за раз, но браузер дает нам эти другие вещи, дает нам эти API, это фактически потоки, вы просто делаете вызов, и эти части браузера знают о параллелизме. Если вы являетесь разработчиком серверной части, эта диаграмма почти такая же. Если во внешнем интерфейсе у нас есть веб-API, а в узле у нас есть API C++, а потоки скрыты от вас с помощью C++.
Теперь вернитесь к тому же приведенному выше примеру, где мы используем setTimeout, Теперь setTimeout — это API, предоставляемый нам браузером, он не находится в исходном коде V8. Браузер запускает таймер для вас, и теперь он будет обрабатывать обратный отсчет для вас, так что это означает, что наш вызов setTimout завершен, и мы можем извлечь из стека и перейти к другому запросу.
Теперь веб-API не может просто начать изменять ваш код, он не может помещать данные в стек, когда они будут готовы. срабатывает очередь обратного вызова. Любой из веб-API помещает обратный вызов в очередь задач, когда он выполнен, и, наконец, мы получаем цикл событий.
Итак, самое простое определение цикла событий: Цикл событий смотрит на стек и посмотрите на очередь задач. Если стек пуст, он берет первое из очереди и помещает его в стек. Которые эффективно его запускают.

Удачного программирования!!

Еще статьи
Полезный трюк с Javascript Array, который нужно знать
Что такое замыкание в javascript, преимущества и недостатки?
С чего начать с GraphQL?
Понимание хуков React