¿'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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta