Что такое поднятие (Hoisting)?

Hoisting — это механизм в JavaScript, при котором объявления переменных и функций перемещаются в верхнюю часть их области видимости во время компиляции, еще до выполнения кода.

Поднятие переменных

Для переменных, объявленных с использованием var, их объявление поднимается в начало области видимости, но их инициализация не поднимается. Это означает, что к переменной можно обратиться до её фактического объявления, но значение будет undefined до тех пор, пока не выполнится инициализация.

console.log(a); // undefined
var a = 10;

В данном случае JavaScript видит это так:

var a;
console.log(a); // undefined
a = 10;

Однако переменные, объявленные с помощью let и const, поднимаются, но остаются в "временной мертвой зоне", пока выполнение не достигнет их инициализации.

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;

Поднятие функций

Функции, объявленные с помощью function declaration, поднимаются полностью (как их объявление, так и тело функции), что позволяет вызывать их до того, как они объявлены в коде.

foo(); // "Hello"
function foo() {
  console.log("Hello");
}

JavaScript видит это так:

function foo() {
  console.log("Hello");
}
foo(); // "Hello"

Функции, объявленные через function expression, поднимаются так же, как и переменные, — только объявление поднимается, но не инициализация.

bar(); // TypeError: bar is not a function
var bar = function() {
  console.log("Hi");
};

Hoisting — это поведение JavaScript, о котором важно помнить при объявлении переменных и функций. Оно помогает избежать ошибок и правильно понимать, как интерпретатор JavaScript работает с кодом.