О работе javascript (1)
Наберем следующий код в редакторе (можно и в онлайн):
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, надеюсь раскрыть эти тему в будущем. Напоминаю, написано мной и для себя. Если кому то помогло - отлично, если нашли ошибку - буду рад исправить, если можете подсказать что-то дельное по теме - непременно пишите