La razón por la que ve problemas como este es porque la consola en sí misma trata de emular el alcance global del contexto al que se dirige actualmente. También intenta capturar los valores de retorno de las declaraciones y expresiones que escribe en la consola, para que aparezcan como resultados. Tomemos, por ejemplo:
> 3 + 2
< 5
Aquí, se ejecuta como si fuera una expresión, pero la ha escrito como si fuera una declaración. En los scripts normales, el valor se descartaría, pero aquí, el código debe ser mutilado internamente (como envolver toda la declaración con un contexto de función y una return
declaración), lo que causa todo tipo de efectos extraños, incluidos los problemas que está experimentando.
Esta es también una de las razones por las cuales algunos códigos básicos de ES6 en scripts funcionan bien pero no en la consola de Chrome Dev Tools.
Intente ejecutar esto en Node y la consola de Chrome:
{ let a = 3 }
En Node o una <script>
etiqueta funciona bien, pero en la consola, da Uncaught SyntaxError: Unexpected identifier
. También le proporciona un enlace a la fuente en la VMxxx:1
que puede hacer clic para inspeccionar la fuente evaluada, que se muestra como:
({ let a = 3 })
Entonces, ¿por qué hizo esto?
La respuesta es que necesita convertir su código en una expresión para que el resultado pueda ser devuelto a la persona que llama y se muestre en la consola. Puede hacer esto envolviendo la declaración entre paréntesis, lo que la convierte en una expresión, pero también hace que el bloque anterior sea sintácticamente incorrecto (una expresión no puede tener una declaración de bloque).
La consola intenta solucionar estos casos extremos al ser inteligente con el código, pero eso está más allá del alcance de esta respuesta, creo. Puede presentar un error para ver si eso es algo que considerarían solucionar.
Aquí hay un buen ejemplo de algo muy similar:
https://stackoverflow.com/a/28431346/46588
La forma más segura de hacer que su código funcione es asegurarse de que se pueda ejecutar como una expresión e inspeccionar el SyntaxError
enlace de origen para ver cuál es el código de ejecución real y aplicarle una solución de ingeniería inversa. Por lo general, significa un par de paréntesis estratégicamente ubicados.
En resumen: la consola intenta emular el contexto de ejecución global con la mayor precisión posible, pero debido a las limitaciones de la interacción con el motor v8 y la semántica de JavaScript, esto a veces es difícil o imposible de resolver.