Hoisting (поднятие) — это механизм JavaScript, при котором объявления переменных и функций перемещаются в начало своей области видимости перед выполнением кода. Это позволяет вызывать функции до их объявления в коде. 📈
Hoisting — это особенность JavaScript, которая часто путает новичков. Понимание этой концепции помогает писать код без неожиданных ошибок. 👨💻
JavaScript «поднимает» объявления переменных и функций в начало области видимости:
// Можно вызвать до объявления
sayHello(); // 'Привет!'
function sayHello() {
console.log('Привет!');
}// Полностью поднимается
declared(); // Работает ✅
function declared() {
return 'Результат';
}// Поднимается только переменная
// expressed(); // Ошибка! ❌
var expressed = function() {
return 'Результат';
};// Это работает благодаря hoisting
console.log(sum(2, 3)); // 5 ✅
function sum(a, b) {
return a + b;
}// Переменные поднимаются, но не инициализируются
console.log(x); // undefined (не ошибка!)
var x = 5;
// Функции поднимаются полностью
greet(); // 'Привет!' ✅
function greet() {
console.log('Привет!');
}// JavaScript делает это перед выполнением:
// 1. var hoisted; // undefined
// 2. function declared() { return 'Работает'; }
// 3. Потом выполняет код
console.log(hoisted); // undefined
var hoisted = 'Значение';
console.log(declared()); // 'Работает'
function declared() {
return 'Работает';
}// Hoisting работает в каждой области видимости
function example() {
// В этой области тоже работает hoisting
console.log(test()); // 'Работает' ✅
function test() {
return 'Работает';
}
}// Полностью поднимается — можно вызывать до объявления
earlyCall(); // Работает ✅
function earlyCall() {
console.log('Вызвали рано');
}// Не поднимаются как Function Declaration
// earlyArrow(); // Ошибка! ❌
var earlyArrow = () => {
console.log('Стрелочная функция');
};// ❌ Думаем, что переменная сразу имеет значение
console.log(value); // undefined, не 10!
var value = 10;
// ✅ На самом деле JavaScript делает:
// var value; // undefined
// console.log(value); // undefined
// value = 10;// ❌ let и const тоже поднимаются, но не инициализируются
// console.log(block); // ReferenceError!
// let block = 'значение';
// ✅ var поднимается и инициализируется как undefined
console.log(oldStyle); // undefined
var oldStyle = 'значение';Понимание hoisting помогает писать более предсказуемый код и избегать ошибок с порядком объявления. 😊
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪