Оформи в песочницу - кодпен, жсфидл
Это не js, это редактор
Потому что сначало создаются все объявленные переменные, при этом var получает значение undefined, а let ничего не получает. Потом начинается присваивание, так как присваивание let провалилось то она остаётся созданной для движка, но ничего не содержит, в стандарте это называется "временная мертвая зона". "В стандарте ECMAScript 2015 переменные, объявленные директивой let, переносятся в начало блока. Но если вы сошлетесь в блоке на переменную, до того как она объявлена директивой let, то это приведет к выбросу исключения ReferenceError, потому что переменная находится во "временной мертвой зоне" с начала блока и до места ее объявления. (В отличии от переменной, объявленной через var, которая просто будет содержать значение undefined)"
Обсуждают сегодня