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