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

Javascript — это однопоточный язык программирования. то есть он может выполнять одну задачу за раз. Он предоставил только один стек вызовов для запуска кода. Параллелизм достигается в javascript с помощью асинхронного обратного вызова javascript, обещания, async/await и т. д. Мы просто прикрепляем обратный вызов к функции, и когда функция завершается, запускается обратный вызов.

Javascript выполняется некоторым движком javascript: v8, паукообразная обезьяна, чакра и т. д.

Контекст выполнения. Программы Javascript разделены на несколько контекстов выполнения. Существуют глобальный контекст выполнения и контекст выполнения функции. В каждом контексте выполнения произошли две вещи

(поднятие + выполнение) — при подъеме каждая новая переменная отводит место в памяти со значением undefined, а функция отводит место, где находится весь ее код. Каждая функция создает новый контекст выполнения, и эти две вещи происходят в каждом новом контексте выполнения.

Компоненты механизма Javascript

Стек вызовов. Стек — это просто структура данных, в которой хранится текущее состояние программы. Он просто сообщает, где мы сейчас находимся в программе. Элементы добавляются последними и удаляются первыми (LIFO), когда они завершены. Когда программа входит в функцию, она помещается в стек вызовов, когда программа возвращается из функции, а затем извлекается из стека.

Куча: куча — это хранилище памяти, в котором хранятся все объекты.

Как работает асинхронный JavaScript?

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

Какое решение?

Четный цикл:

Веб-браузер предоставляет множество веб-API (setTimeout, события DOM, выборка и т. д.). В Node.js это C++ API. Теперь простым решением является предоставление функции обратного вызова для обработки изображений или любого веб-API. Поэтому, когда браузер видит что-то асинхронное, оно выталкивается из стека и ждет его завершения. Когда оно завершено или запущено, соответствующий обратный вызов помещается в очередь сообщений (очередь заданий). Теперь задача цикла событий заключается в наблюдении за стеком и очередью сообщений, когда стек пуст, а затем цикл событий извлекает один элемент из очереди и помещается в стек.

Очередь сообщений: структура данных для хранения сообщений, которые будут обработаны позже.

Промисы имеют больший приоритет в очереди сообщений, чем обратные вызовы.