Я просматривал пример документации «Разница между 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
не определено (Chromium)ReferenceError: невозможно получить доступ к лексическому объявлению
x
перед инициализацией (Firefox)
Я понимаю, что let
не позволяет поднимать x
, но поскольку на него ранее ссылались (подразумевая автоматическое объявление из глобальной области видимости), не должно ли в этом случае происходить повторное объявление?
SyntaxError: Identifier
x
уже объявлен
И поэтому ошибка выше выброшена?
Я также понимаю, что в строгом режиме первый сниппет вызовет ReferenceError, значит ли это, что let
навязывает это конкретное правило строгого режима (все переменные должны быть объявлены) в глобальном масштабе?
let
также поднимается, вы просто обращаетесь к нему во временной мертвой зоне. Я не понимаю, при чем здесь строгий режим. - person Bergi   schedule 03.01.2017let
). Поскольку доступ к переменной до ее собственного объявленияlet
вызывает ReferenceError, я думал, что это связано с поведением/правилом строгого режима, но теперь я понимаю, что это связано с тем, чтоlet
поднимает переменную. - person CPHPython   schedule 04.01.2017