Для первой ситуации ошибка возникает во время let i
, поскольку i уже был объявлен в той же области.
let i = 2;
let i = i;
// ↑ i is already defined in current scope
В циклах for на самом деле есть две области. Во вложенной области вы можете переопределить i
, это просто закроет внешнюю область i
.
Но ошибка возникает при доступе к значению i
, потому что вы обращаетесь к нему при определении это, поскольку внутренний i
не был инициализирован.
let i = 0;
{
let i = i;
// ↑ i hasn't been initialized yet, you can't access it as a value
}