'Let' переопределяет глобальное объявление и генерирует ReferenceError?
Я переживал разницу междуvar
а такжеlet
В примере документации и тестировалось, что при вызове необъявленной переменной глобальная область автоматически предоставляет объявление для нее (поэтому следующий фрагмент не вызывает ошибку ни в одной из переменных):
x = 3;
console.log(x);
(function() {
y=x+39;
})()
console.log(y);
Однако, когда одна переменная объявлена сlet
после назначения в той же глобальной области видимости:
x=3;
let x = 42;
console.log(x);
Выдается одна из следующих ошибок:
ReferenceError: x
не определено (хром)
ReferenceError: не может получить доступ к лексическому объявлениюx
до инициализации (Firefox)
Я это понимаюlet
не позволяетx
поднять, но так как на него уже ссылались (подразумевается автоматическое объявление из глобальной области), не должно ли в этом случае произойти повторное объявление?
Ошибка синтаксиса: Идентификаторx
уже был объявлен
И поэтому ошибка выше брошена?
Я также понимаю, что встрогий режим первый фрагмент будет бросатьReferenceError, значит ли это, чтоlet
навязывает это конкретное правило строгого режима (все переменные должны быть объявлены) в глобальной области видимости?