матчасть js
July 25, 2022

О работе javascript (1)

Под капотом js

Наберем следующий код в редакторе (можно и в онлайн):

console.log(varVal)
console.log(letVal)
console.log(constVal)
var varVal
let letVal
const constVal

Что мы увидим в консоли?

А c этим что (удалим последнюю строку)?

console.log(varVal)
console.log(letVal)
console.log(constVal)
var varVal
let letVal
//const constVal

В первом случае мы увидим нечто типа (кстати сообщения могут различаться)

...somedir/index.js:6
const constVal
^^^^^^^^
SyntaxError: Missing initializer in const declaration
undefined
ReferenceError: Cannot access 'letVal' before initialization
at Object.<anonymous> (/home/...somedir/index.js:2:13)
at Module._compile (internal/modules/cjs/loader.js:999:30)

Вопрос - почему так происходит?

В первом случае получаем ошибку в конце кода, а когда удаляем этот участок - то получаем ошибку на 2 строке. Отсюда мы уже можем понять что код "обрабатывается" как минимум 2 раза.

Нашел такой ресурс https://astexplorer.net/, где можно увидеть результат работы парсера js кода. Парсер проходит по коду и переводит js код в некий список данных который называют AST. Проблему создания const без присвоения можно найти уже на этом этапе, поскольку сама концепция const заключается в том чтобы присвоить некое значение переменной и затем не менять его. Поэтому парсер проходит по строке где есть символы "const", далее через пробел ожидает символы названия переменной, далее "символ присвоения" и значение переменной. В нашем коде последнего пункта нет, поэтому уже можно вывести сообщение об ошибке в коде. Кстати на этом же ресурсе можно менять парсеры, и например обнаружить что парсер "typescript" построит AST с нашим кодом=)

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