(Введение
В интервью другим крупным компаниям, таким как Tencent Byte, часто задают вопрос о предварительной компиляции JavaScript.Эта статья покажет вам конкретный процесс предварительной компиляции JS.
(2) Этапы компиляции и выполнения
Шаги компиляции традиционного скомпилированного языка
Для традиционных компилируемых языков шаги компиляции обычно следующие:Лексический анализ -> Синтаксический анализ -> Генерация кода, введем эти три процесса по отдельности.
- лексический анализ
Этот процесс разделяет код на синтаксические единицы, такие какvar a = 520;
Этот код обычно разбивается наvar
,a
,=
,520
эти 4 лексические единицы.
- Разбор
Этот процесс заключается в объединении лексических единиц в многомерный массив, а именноАбстрактное синтаксическое дерево (AST), возьмите следующий код в качестве примера
if(typeof a == "undefined" ){
a = 0;
} else {
a = a;
}
alert(a);
Когда интерпретатор JavaScript строит синтаксическое дерево, если он обнаруживает, что оно не может быть построено, он сообщитсинтаксическая ошибка (syntaxError), и завершает синтаксический анализ всего блока кода.
- генерация кода
Этот процесс заключается в преобразовании абстрактного синтаксического дерева AST в исполняемый машинный код, чтобы компьютер мог его прочитать и выполнить.
Шаги компиляции JavaScript
Движок JavaScript намного сложнее, чем традиционный компилятор языка, всего в 3 шага, но в целом процесс компиляции JavaScript состоит только из следующих трех шагов:1. Синтаксический анализ 2. Прекомпилировать 3. Объясните и выполните
(3) Подробная предварительная компиляция
Обзор предварительной компиляции
Прекомпиляция JavaScript происходит за несколько микросекунд (или даже раньше!) до выполнения фрагмента кода.Существует два типа прекомпиляции: прекомпиляция функции и глобальная прекомпиляция.Глобальная прекомпиляция происходит при загрузке страницы.Когда функция выполняется, предварительная компиляция функции происходит непосредственно перед ее выполнением.Прекомпиляция создает контекст выполнения для текущей среды.
Прекомпиляция функций выполняет четыре шага
- Создать Объект Активации (далее – Объект Активации);
- Найти формальные параметры и объявления переменных, использовать объявления переменных и формальные параметры в качестве имен атрибутов AO, а значение не определено;
- Унифицировать фактические и формальные значения параметров;
- Найдите объявление функции в теле функции, используйте имя функции в качестве имени атрибута объекта AO и присвойте значение телу функции.
код дела
//请问下面的console.log()输出什么?
function fn(a) {
//console.log(a);
var a = 123//变量赋值
//console.log(a);
function a() { }//函数声明
//console.log(a);
var b = function () { }//变量赋值(函数表达式)
//console.log(b);
function d() { }//函数声明
}
fn(1)//函数调用
Согласно приведенным выше четырем частям, после аннотирования кода мы можем легко узнать, что выводит четыре console.log(), давайте посмотрим на изменения AO.
- Создать объект АО
AO{
//空对象
}
- Найти формальные параметры и объявления переменных, использовать объявления переменных и формальные параметры в качестве имен свойств AO, а значение не определено;
AO{
a: undefined
b: undefined
}
- Унифицировать фактические и формальные значения параметров;
AO{
a: 1,
b: undefined
}
- Найдите объявление функции в теле функции, используйте имя функции в качестве имени атрибута объекта AO и присвойте значение телу функции.
AO{
a: function(){}
b: undefined
d: function(){}
}
Наконец, ниже приведен полный процесс предварительной компиляции.
AO:{
a:undefined -> 1 -> function a(){}
b:undefined
d:function d(){}
}
Глобальная трилогия о предварительно скомпилированном исполнении
- Создать Глобальный объект (далее сокращенно ГО объект);
- Найти формальные параметры и объявления переменных, использовать объявления переменных и формальные параметры в качестве имен свойств GO, а значение не определено;
- Найдите объявление функции в глобале, используйте имя функции в качестве имени атрибута объекта GO и присвойте значение телу функции.
код дела
global = 100;
function fn() {
//console.log(global);
global = 200;
//console.log(global);
var global = 300;
}
fn();
Согласно глобальной предварительно скомпилированной трилогии, мы можем узнать его процесс изменения GO.
- Создание объектов GO
GO{
// 空对象
}
- Найдите формальные параметры и объявления переменных, используйте объявления переменных и формальные параметры в качестве имен свойств GO, а значение не определено.
GO: {
global: undefined
}
- Найдите объявление функции в глобале, используйте имя функции в качестве имени атрибута объекта GO и присвойте значение телу функции.
GO: {
global: undefined
fn: function() { }
}
Обратите внимание, что объявление функции здесь принесет собственный AO функции, и процесс предварительной компиляции может продолжать применять четыре шага.
(4) Резюме
Когда интервьюер спросит вас о процессе предварительной компиляции, вы можете легко ответить на него в соответствии с приведенным выше содержанием.В то же время вы также столкнетесь со многими вопросами о выходном значении console.log() во время интервью. Вы также можете использовать приведенную выше формулу, чтобы получить правильный ответ.
Эта статья была включенаПодробное объяснение технологии JavaScript, и другие технологии JavaScript можно найти в колонке.
❤ Кодовое слово не просто нажать на бесплатный лайк ❤