Estaba investigando un poco sobre el v/s compilado interpretado. Encontré este artículo que dice...
console.log("Hello World"); oops oops; Este código no generará Hello World porque JS está compilado y debido a oops oops; El compilador JS arrojará un error que seguramente lo hace. SyntaxError: Unexpected identifier
Pero si elimino el segundo oops , es decir
console.log("Hello World"); oops; Este código aún arroja un error, aunque es un error diferente ReferenceError: oops is not defined , pero primero escribe Hello World en la consola.
Entiendo los dos errores. Entonces, cuando hay un error de sintaxis , el proceso de compilación se detiene porque no puede procesar la sintaxis incorrecta y no puede producir un AST (Árbol de sintaxis abstracta) por lo que entiendo. Por lo tanto, no hay código de bytes. Pero cuando se trata de un error de referencia , ¿cómo se puede compilar?
Lo siento si estoy haciendo esta pregunta en el intercambio equivocado. Si es así, solo hágame saber el foro correcto donde debería hacer esta pregunta.
Además, sé que es un comportamiento inesperado, y no debería preguntar por qué el código roto actúa de la forma en que lo hace. Tengo curiosidad.
El primer paso es tokenización/escaneo/lexing:
console.log("Hello World"); oops oops;se "divide" en
console . log ( "Hello World" ) ; oops oops ;Luego viene el analizador (que valida/analiza un flujo de tokens en un árbol).
Ve esto como una declaración (una llamada de función):
console . log ( "Hello World" ) ;Entonces ve esto:
oops oops;Lo cual es una sintaxis no válida y, por lo tanto, tiene un error de sintaxis.
En su segundo ejemplo, esto es solo:
oops;Que es una sintaxis válida.
A continuación, después de crear este árbol de algún tipo, hay JIT y muchos otros pasos, pero solo nos interesa la ejecución.
Ejecuta console.log perfectamente bien, pero luego ve que hay un identificador que no está definido. De ahí el error de referencia.
Entonces, en resumen, JavaScript se interpreta (también se compila justo a tiempo) y, debido a que se interpreta, interpreta su código "línea por línea". Interpreta y ejecuta console.log, luego intenta interpretar y ejecutar oops; , lo que da como resultado un error.