Hoisting (всплытие) — это механизм JavaScript, при котором объявления переменных и функций перемещаются в верхнюю часть своей области видимости до выполнения кода.
Это не значит, что строки кода реально перемещаются, но движок JS сначала обрабатывает объявления, а затем выполняет код.
varconsole.log(a); // undefined
var a = 5;Переменная a всплывает, но инициализация (= 5) происходит позже. Это работает так:
var a;
console.log(a); // undefined
a = 5;let и constconsole.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, добавляй сайт в избранное и прокачивай себя каждый день 💪