¿'Let' anula una declaración global y arroja un ReferenceError?
Estaba pasando por la diferencia entrevar
ylet
ejemplo de documentación y estaba probando que cuando se invoca una variable no declarada, el alcance global proporciona automáticamente una declaración (es por eso que el siguiente fragmento no arroja un error en ninguna de las variables):
x = 3;
console.log(x);
(function() {
y=x+39;
})()
console.log(y);
Sin embargo, cuando una variable se declara conlet
después de la asignación en el mismo alcance global:
x=3;
let x = 42;
console.log(x);
Se produce uno de los siguientes errores:
Error de referencia: x
no está definido (cromo)
Error de referencia: no se puede acceder a la declaración léxicax
antes de la inicialización (Firefox)
Entiendo quelet
no permitex
para izar, pero como se hizo referencia anteriormente (lo que implica una declaración automática del alcance global), ¿no debería ocurrir en este caso una nueva declaración?
Error de sintaxis: Identificadorx
ya ha sido declarado
¿Y por lo tanto el error anterior arrojado?
También entiendo que enModo estricto el primer fragmento arrojaría unError de referencia, entonces esto significa quelet
fuerza esta regla particular de modo estricto (todas las variables deben declararse) en el ámbito global?