Точно..думаю немного разобрался. Спасибо ещё раз.
Поразбирайся, там на самом деле много интересного.
function first (){
debugger;
eval()
let hello = 'hi';
return hello
}
У тебя в дебаггере не будет показываться hello, потому что он показывает только инициализированные переменные.
На самом деле в этот момент hello уже есть в лексическом окружении. let и const всплывают так же как и var, но не инициализируются, поэтому обращение к ним до объявления вызывает ошибку. Где-то в обсуждениях спецификации читал, что const из-за своей семантики должен получать только одно значение. Поэтому const при всплытии не инициализируется со значением undefined, чтобы потом его не перезаписывать. Для let сделали такое же поведение, чтобы они вели себя одинаково. и не вызывали путаницу.