Elevación de Javascript y declaración de alcance global
En javascript, la fase de compilación busca y asocia todas las declaraciones con sus alcances apropiados.
CASO 1
a = 2;
console.log(a);
Si no se utiliza en modo estricto, se supone que el fragmento se procesa realmente como:
var a;
a = 2;
console.log(a);
Salida: 2
CASO2
si la declaración ocurre debajo de console.log ()
console.log(a);
var a = 2;
Aquí en la línea 1: el compilador verificará la declaración de a en su alcance si no se encuentra, el alcance global asignará uno y el mismo código se asumirá nuevamente como
var a;
console.log(a);
a = 2;
Salida: indefinido // ya que no se asigna ningún valor mientras el intérprete lee la consola
CASO3
console.log(a);
a = 2;
Salida: RefErr
¿Por qué esto arroja un error de referencia y no indefinido?
Respuestas
Si observa detenidamente sus dos primeros casos, siempre está declarando la variable a, y en JavaScript solo se incluyen las declaraciones.
Dicho esto, en su Case 3, la variable anunca se declara, por lo tanto, la elevación no es posible aquí. Con esto, no hay una variable por el nombre aen el ámbito de aplicación, y por lo tanto, ReferenceError.
Si observa la descripción de ReferenceError , se lee:
El objeto ReferenceError representa un error cuando se hace referencia a una variable inexistente.
Los globales implícitos no implican una vardeclaración. No hay que izarlos.