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?
letis hoisted as well, you just are accessing it during the temporal dead zone. I don't see what strict mode has to do with this. - Bergiletdeclaration). Since accessing a variable before its ownletdeclaration throws a ReferenceError, I thought that a strict-mode-behavior/rule was related, but now I understand that it is due tolethoisting the variable. - CPHPython