Hoisting (всплытие) — это механизм JavaScript, при котором объявления переменных и функций перемещаются в верхнюю часть своей области видимости до выполнения кода.
Это не значит, что строки кода реально перемещаются, но движок JS сначала обрабатывает объявления, а затем выполняет код.
var
console.log(a); // undefined
var a = 5;
Переменная a
всплывает, но инициализация (= 5
) происходит позже. Это работает так:
var a;
console.log(a); // undefined
a = 5;
let
и const
console.log(b); // ReferenceError
let b = 10;
let
и const
тоже всплывают, но попадают в TDZ (Temporal Dead Zone) — область, в которой переменная уже существует, но доступ к ней запрещён до инициализации.
greet(); // "Привет!"
function greet() {
console.log("Привет!");
}
Функции, объявленные через function declaration
, всплывают полностью, включая тело функции.
sayHi(); // TypeError: sayHi is not a function
var sayHi = function() {
console.log("Hi");
};
Здесь sayHi
— переменная, объявленная через var
, она всплывает как undefined
, но функция не привязана к ней до строки с присваиванием.
Тип конструкции | Всплывает? | Комментарий |
---|---|---|
var | Да | Объявление всплывает, но инициализация — нет |
let / const | Да (но в TDZ) | ReferenceError при доступе до инициализации |
function declaration | Да | Всплывает вместе с телом функции |
function expression | Частично | Переменная всплывает, но как undefined |
arrow function через const | Да (но в TDZ) | Ошибка до инициализации |
console.log(name);
var name = "Aleksandr Ermolov";
sayHello();
function sayHello() {
console.log("Hello");
}
sayBye();
var sayBye = function () {
console.log("Bye");
};
console.log(age);
let age = 30;
greet();
const greet = () => {
console.log("Hi!");
};
if (true) {
var test = "yes";
}
console.log(test);
var
и function declaration
всплывают, let/const
— тоже, но попадают в TDZ.function expression
, не всплывают как полноценные функции.Хочешь больше статей по подготовке к собеседованию? Подпишись на EasyAdvice(@AleksandrEmolov_EasyAdvice), добавляй сайт в избранное и прокачивай себя каждый день 💪