Що таке hoisting?
Механізм hoisting, або підняття, є поведінкою інтерпретатора JavaScript, за якої оголошення змінних і функцій переміщуються у верхню частину їх області видимості перед початком виконання коду. Важливо розуміти, що фізично рядки коду не переміщуються у файлі, але на етапі компіляції пам'ять під них виділяється заздалегідь. При цьому спосіб підняття безпосередньо залежить від ключового слова, використаного при оголошенні. Змінні, створені через var, піднімаються на початок функціональної області видимості та автоматично ініціалізуються значенням undefined, через що до них можна звернутися до рядка оголошення, отримавши невизначений результат, але не помилку.
З появою let і const поведінка змінилася заради підвищення надійності коду. Оголошення через let і const також піднімаються, але вони не отримують початкового значення і поміщаються в так звану тимчасову мертву зону, або temporal dead zone. Спроба звернутися до такої змінної до рядка її фізичного оголошення в коді призведе до викиду помилки ReferenceError. Що стосується функцій, то оголошення класичних функцій через function declaration піднімаються повністю, включаючи їх тіло, що дозволяє викликати функцію до того, як вона була написана в тексті скрипта. При цьому важливо пам'ятати, що піднімаються виключно самі оголошення, а не операції присвоєння значень змінним.