I was going through the Difference between var and let documentation example and was testing that when an undeclared variable is invoked, the global scope automatically provides a declaration for it (that's why the following snippet does not throw an error in any of the variables):
x = 3;
console.log(x);
(function() {
y=x+39;
})()
console.log(y);
However, when one variable is declared with let after the assignment in the same global scope:
x=3;
let x = 42;
console.log(x);
One of the following errors is thrown:
ReferenceError:
xis not defined (Chromium)ReferenceError: can't access lexical declaration
xbefore initialization (Firefox)
I understand that let does not allow x to hoist, but since it was previously referenced (implying an automatic declaration from the global scope) shouldn't in this case a re-declaration happen?
SyntaxError: Identifier
xhas already been declared
And therefore the error above thrown?
I also understand that in strict mode the first snippet would throw a ReferenceError, so does this mean that let forces this particular rule of strict mode (all variables need to be declared) upon the global scope?