Что такое «поднятие» в JavaScript на примере?
Поднятие в JavaScript — это поведение, при котором объявления переменных и функций перемещаются в верхнюю часть их содержащей области (глобальной или функциональной) во время фазы компиляции, перед выполнением кода. Однако поднимаются только объявления, а не инициализации.
Переменное поднятие
Для переменных, объявленных с помощью var
, поднимается объявление, но не инициализация.
console.log(a); // Output: undefined
var a = 5;
console.log(a); // Output: 5
В приведенном выше примере переменная a
поднимается наверх своей области видимости, поэтому первый console.log(a)
не выдает ошибку, а возвращает undefined
, поскольку инициализация (a = 5
) не поднимается.
Функция поднятия
Объявления функций полностью поднимаются, то есть и объявление, и тело функции перемещаются в верхнюю часть области действия.
hoistedFunction(); // Output: "This function is hoisted!"
function hoistedFunction() {
console.log("This function is hoisted!");
}
В этом случае функцию hoistedFunction
можно вызвать до ее фактического объявления в коде.
Let и Const
Переменные, объявленные с помощью let
и const
, также поднимаются, но не инициализируются. Они остаются во "временной мертвой зоне" с начала блока до тех пор, пока не встретится объявление.
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;
console.log(b); // Output: 10
console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 20;
console.log(c); // Output: 20
В приведенном выше примере обращение к b
или c
до их объявления приведет к возникновению ReferenceError
, поскольку они находятся во временной мертвой зоне.
console.log(x); // undefined
var x = 10;
hoisted(); // "Function hoisted!"
function hoisted() {
console.log("Function hoisted!");
}
console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 20;
console.log(z); // ReferenceError: Cannot access 'z' before initialization
const z = 30;
Заключение
Переменные, объявленные с помощью var
, поднимаются, но инициализируются до undefined
. Объявления функций полностью поднимаются. Переменные, объявленные с помощью let
и const
, поднимаются, но не инициализируются, что приводит к временной мертвой зоне.