"Поднятие" (hoisting) – это поведение JavaScript по умолчанию, когда любая декларация передвигается вверх области видимости.
Декларации в JavaScript поднимаются
В JavaScript переменная может декларироваться уже после использования.
Другими словами, переменная может использоваться до того, как она будет декларирована.
Ниже, результат в примере 1 будет таким же, что в примере 2.
Пример 1
x = 5; // Присвоить 5 переменной x
elem = document.getElementById("demo"); // Найти элемент
elem.innerHTML = x; // Вставить значение переменной x в элемент
var x; // Декларировать переменную x
Пример 2
var x; // Декларировать переменную x
x = 5; // Присвоить 5 переменной x
elem = document.getElementById("demo"); // Найти элемент
elem.innerHTML = x; // Вставить значение переменной x в элемент
Чтобы в этом разобраться, необходимо понять сам термин "поднятие".
"Поднятие" (hoisting) – это поведение JavaScript по умолчанию, когда все декларации передвигаются вверх текущей области видимости (вверх текущего скрипта или текущей функции).
Инициализации не поднимаются
В JavaScript поднимаются только декларации, а не инициализации.
Ниже, результат в примере 1 будет не таким же, что в примере 2.
Пример 1
var x = 5; // Инициализация переменной x
var y = 7; // Инициализация переменной y
elem = document.getElementById("demo"); // Найти элемент
elem.innerHTML = x + " " + y; // Отобразить x и y
Пример 2
var x = 5; // Инициализация переменной x
elem = document.getElementById("demo"); // Найти элемент
elem.innerHTML = x + " " + y; // Отобразить x и y
var y = 7; // Инициализация переменной y
В последнем примере будет выведено undefined как значение переменной y. Это вызвано тем, что только декларации (var y), а не инициализации (=7) поднимаются вверх.
Благодаря "подъему" переменная y была декларирована перед использованием, но так как инициализация не поднимается, значение переменной y оказывается неопределенным (undefined).
Пример 2 аналогичен следующей записи:
var x = 5; // Инициализация переменной x
var y; // Декларирование переменной y
elem = document.getElementById("demo"); // Найти элемент
elem.innerHTML = x + " " + y; // Отобразить x и y
y = 7; // Присвоить 7 переменной y
Всегда декларируйте переменные в начале!
Для многих разработчиков "подъем" остается неизвестным или упускаемым из виду поведением JavaScript.
Если разработчик не учитывает "подъем", то в коде могут появляться ошибки.
Чтобы избежать подобных ошибок, всегда декларируйте все переменные в начале содержащей их области видимости. Учитывая то как JavaScript интерпретирует код, это будет хорошим правилом.
Внимание! В строгом режиме JavaScript не допускает использование переменных, если они не декларированы.