ключевая идея лексической области видимости заключается в том, что она полностью определяется размещением функций, блоков и объявлений переменных относительно друг друга.
Интерпретация решает примерно ту же задачу, что и компиляция, — в том смысле, что преобразует вашу программу в набор инструкций, понятных машине. При этом используется другая модель обработки. Если при компиляции обрабатывается сразу вся программа, при интерпретации исходный код преобразуется строка за строкой; после выполнения каждой строки или команды происходит немедленный переход к следующей строке исходного кода.
Функции JS сами по себе являются полноправными значениями; их можно присваивать и передавать точно так же, как числа или строки. Но так как эти функции содержат переменные и обращаются к ним, они поддерживают свою исходную область видимости независимо от того, в какой точке программы эти функции будут выполняться в конечном итоге. Эта концепция называется замыканием.
JS обычно относят к категории интерпретируемых языков сценариев, поэтому предполагается, что большинство программ JS обрабатывается за один проход «сверху вниз». Но в действительности JS разбирается/компилируется в отдельной фазе до начала выполнения. Решения автора кода в отношении того, как размещать переменные, функции и блоки относительно друг друга, анализируются с учетом правил области видимости в исходной фазе разбора/компиляции. Полученная структура кода обычно не зависит от условий стадии выполнения.
Чтобы свести эту главу к одному полезному выводу, ключевая идея лексической области видимости заключается в том, что она полностью определяется размещением функций, блоков и объявлений переменных относительно друг друга.
Если объявление переменной размещается внутри функции, компилятор обрабатывает его в процессе разбора функции и связывает это объявление с областью видимости функции. Если переменная объявлена с блоковой областью видимости (let/const), то она связывается с ближайшим вмещающим блоком {..} вместо вмещающей функции (как с ключевым словом var).
снова возможно только одно разумное объяснение: код полностью разбирается до начала выполнения.
TDZ — временное окно, в котором переменная существует, но все еще остается неинициализированной, и поэтому к ней невозможно обратиться никаким способом. Только команды, оставленные компилятором в точке исходного объявления, могут выполнить эту инициализацию. После этого момента TDZ завершается, а переменная может свободно использоваться в оставшейся части области видимости
Если при компиляции обрабатывается сразу вся программа, при интерпретации исходный код преобразуется строка за строкой; после выполнения каждой строки или команды происходит немедленный переход к следующей строке исходного кода.
Если переменная является источником, безрезультатный поиск идентификатора считается необъявленной (неизвестной, отсутствующей) переменной, что всегда приводит к выдаче ошибки ReferenceError.
var studentName;
typeof studentName; // "undefined"