Короче, лучше всего разобраться с понятие хоистинг и тогда будет понимание, что происходит и зачем)
Интерпретатор про let знает тоже до ее объявления, т.е let тоже всплывает, но не доступна и обращение до объявления вызовет ошибку. Но const и let тоже всплывает. Интерпретатор проходит дважды по коду, все var = undefined , а let не инициализирована и не доступны. Но в самом начале интерпретатор знает о всех переменных, если бы let не всплывало, мы могли бы хоть сто раз их объявить, но let можно только один раз объявить.