Что делает 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 :*

Разбор

  1. Движок V8 имеет ***sub program called the Syntax Parser*** , который анализирует код JS и создает AST ⇒ абстрактное синтаксическое дерево.
  2. По мере выполнения синтаксического анализа начинается фаза выделения памяти, на которой происходят три вещи:
     – создается Объект переменной памяти, который содержит выделение памяти для все lets, vars, consts и functions.
     – Переменной выделяется память в куче, и ей присваивается ключевое слово undefined.
     – Для functions в Объект переменной памяти , AST еще не создан . AST будет создан только после создания FEC для этой функции, т. е.: функция вызвана.
     – цепочка областей создана.
     – ключевое слово this создается и определяется в соответствии с контекстом области.

Исполнение

(Следует отметить, что до начала этого этапа память уже выделена для всех переменных)

  1. После анализа кода JS, создания AST и выделения памяти следует процедура компиляции JIT:
  2. AST интерпретируется, немедленно компилируется и выполняется. На этом этапе значения инициализируются неопределенными переменными в Объекте памяти переменных.
  3. В случае вызова функции создается Контекст выполнения функции, который повторяет шаги создания AST, выделения памяти и цепочки областей действия. После выполнения функции байт-код сохраняется, чтобы его можно было использовать повторно.

Чтобы узнать больше о JS ByteCode:

https://www.linkedin.com/pulse/what-v8-javascript-engine-bytecode-mohammad-dalvand/