Что делает JS перед началом выполнения?
Javascript runs inside a JRE , i.e : a JavaScript Runtime Enviornment
Из чего состоит JRE?
- Механизм JavaScript, который отвечает за:
- Компилирует и выполняет код JS
- Обработку стека вызовов — выполнение функций JS в определенном порядке
- Управление выделением памяти для объектов — кучу памяти
- Сбор мусора — объектов, которые больше не будут использоваться
- Предоставление всех типов данных, операторов, объектов и функций. - Набор API
- Цикл событий
- Набор очередей (микрозадачи и обратный вызов)
Движок JavaScript — это сердце JRE, которое используется браузерами и Node.js.
Одним из самых популярных движков JS является движок V8, который используется в Google Chrome, Node.js, Microsoft Edge. Mozilla использует Spidermonkey.
The V8 engine does not run on a single thread, but the callstack which executes js in itself is a single thread of execution. V8 is written in C++ , therfore is multi threaded.
Это связано с тем, что V8 должен обрабатывать сбор мусора, управление памятью и другие процессы и т. д.
Следует иметь в виду, что набор API-интерфейсов, предоставляемых браузером и Node.js, может быть схожим, но это не одно и то же.
Движок JavaScript не является виртуальной машиной или контейнером. Это программа, написанная на C++, которая принимает код JS как i/p.
Что движок JS делает с нашим JS-кодом?
*First and foremost when a JS file is loaded into the Engine, a GEC is created, in which the below steps are undergone :*
Разбор
- Движок V8 имеет
***sub program called the Syntax Parser***
, который анализирует код JS и создает AST ⇒ абстрактное синтаксическое дерево. - По мере выполнения синтаксического анализа начинается фаза выделения памяти, на которой происходят три вещи:
– создается Объект переменной памяти, который содержит выделение памяти для всеlets
,vars
,consts
иfunctions
.
– Переменной выделяется память в куче, и ей присваивается ключевое словоundefined
.
– Дляfunctions
в Объект переменной памяти , AST еще не создан . AST будет создан только после создания FEC для этой функции, т. е.: функция вызвана.
– цепочка областей создана.
– ключевое словоthis
создается и определяется в соответствии с контекстом области.
Исполнение
(Следует отметить, что до начала этого этапа память уже выделена для всех переменных)
- После анализа кода JS, создания AST и выделения памяти следует процедура компиляции
JIT
: - AST интерпретируется, немедленно компилируется и выполняется. На этом этапе значения инициализируются неопределенными переменными в Объекте памяти переменных.
- В случае вызова функции создается Контекст выполнения функции, который повторяет шаги создания AST, выделения памяти и цепочки областей действия. После выполнения функции байт-код сохраняется, чтобы его можно было использовать повторно.
Чтобы узнать больше о JS ByteCode:
https://www.linkedin.com/pulse/what-v8-javascript-engine-bytecode-mohammad-dalvand/