Hoisting
Hoisting представляет процесс доступа к переменным до их определения. Возможно, данная концепция выглядит немного странно, но она связана с работой компилятора JavaScript. Компиляция кода происходит в два прохода. При первом проходе компилятор получает все объявления переменных, все идентификаторы. При этом никакой код не выполняется, методы не вызываются. При втором проходе собственно происходит выполнение. И даже если переменная определена после непосредственного использования, ошибки не возникнет, так как при первом проходе компилятору уже известны все переменные. То есть как будто происходит поднятие кода с определением переменных и функций вверх до их непосредственного использования. Поднятие на английский переводится как hoisting, сообственно поэтому данный процесс так и называется. Переменные, которые попадают под hoisting, получают значение undefined.
Например, возьмем следующий простейший код:
console.log(foo);
Его выполнение вызовет ошибку ReferenceError: foo is not defined
, добавим определение переменной:
// undefined
console.log(foo);
var foo = "Tom";
В этом случае консоль выведет значение undefined
. При первом проходе компилятор узнает про существование переменной foo
. Она получает значение undefined. При втором проходе вызывается метод console.log(foo)
.
Главная цель статьи донести, что объявлять и инициализировать переменные функции нужно в начале функции