'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 навязывает это конкретное правило строгого режима (все переменные должны быть объявлены) в глобальной области видимости?

Ответы на вопрос(1)

Ваш ответ на вопрос