Как я понимаю, весь код выполняется в 2 этапа: первичный скан кода(компиляция) и выполнение кода. Однако, мне не совсем понятно на каком этапе происходит объявление переменных.
С одной стороны
здесь указывается, что перед выполнением JavaScript-кода создаётся контекст выполнения. В этой же статье ниже приведен пример схематичного представления контекста выполнения:
let a = 20;
const b = 30;
var c;
function multiply(e, f) {
var g = 20;
return e * f * g;
}
c = multiply(20, 30);
console.log(c);
//Схематичное представление контекста выполнения для этого кода будет выглядеть так:
// GlobalExectionContext = {
// ThisBinding: <Global Object>,
// LexicalEnvironment: {
// EnvironmentRecord: {
// Type: "Object",
// // Данные о привязках для идентификаторов
// a: < uninitialized >,
// b: < uninitialized >,
// multiply: < func >
// }
// outer: <null>
// },
// VariableEnvironment: {
// EnvironmentRecord: {
// Type: "Object",
// // Данные о привязках для идентификаторов
// c: undefined,
// }
// outer: <null>
// }
// }
// FunctionExectionContext = {
// ThisBinding: <Global Object>,
// LexicalEnvironment: {
// EnvironmentRecord: {
// Type: "Declarative",
// // Данные о привязках для идентификаторов
// Arguments: {0: 20, 1: 30, length: 2},
// },
// outer: <GlobalLexicalEnvironment>
// },
// VariableEnvironment: {
// EnvironmentRecord: {
// Type: "Declarative",
// // Данные о привязках для идентификаторов
// g: undefined
// },
// outer: <GlobalLexicalEnvironment>
// }
// }
То бишь как я понимаю, при первичном скане кода происходит объявление переменных. Для переменных, объявленных с помощью let и const, пишет uninitialized - то есть эти переменные объявлены, но еще не инициализированы. Переменные, объявленные с помощью var, сразу инициализируются с помощью undefined.
С другой стороны существует TDZ - temporal dead zone.
Здесь приводится такое определение:
TDZ - это термин для описания состояния, когда переменные недоступны. Они находятся в области видимости, но не объявлены.
И здесь вроде бы как получается, что объявление происходит уже во время выполнения кода. Так когда же все-таки оно происходит?