@Ivanushka255

Когда происходит объявление переменных?

Как я понимаю, весь код выполняется в 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 - это термин для описания состояния, когда переменные недоступны. Они находятся в области видимости, но не объявлены.


И здесь вроде бы как получается, что объявление происходит уже во время выполнения кода. Так когда же все-таки оно происходит?
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Yagher
И здесь вроде бы как получается, что объявление происходит уже во время выполнения кода.

Объявление переменных происходит во время первого прохода компилятора.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы