Можешь объяснить механизм hoisting в JavaScript, в том числе как function declarations, `var`, `let` и `const` обрабатываются по-разному на этапе компиляции? — ДейлиПреп