Hoisting — это поведение JS, при котором объявления переменных и функций «поднимаются» в начало своей области видимости на этапе компиляции. Function declaration поднимается целиком — можно вызвать до объявления. А вот var поднимается только объявление, но не присвоение — поэтому до строки с присвоением будет undefined. let и const тоже поднимаются, но попадают в temporal dead zone — обращение до объявления выбросит ReferenceError.