Con este código:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Me sale este resultado inesperado:
Cuando cambio el código:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Obtengo el resultado esperado:
Además, si hay alguna llamada a eval
la función interna, puedo acceder a mi variable como quiero hacerlo (no importa a lo que le pase eval
).
Mientras tanto, las herramientas de desarrollo de Firefox ofrecen el comportamiento esperado en ambas circunstancias.
¿Qué pasa con Chrome que el depurador se comporta de manera menos conveniente que Firefox? He observado este comportamiento durante algún tiempo, hasta la versión 41.0.2272.43 beta incluida (64 bits).
¿Es que el motor de JavaScript de Chrome "aplana" las funciones cuando puede?
Curiosamente, si agrego una segunda variable a la que se hace referencia en la función interna, la x
variable aún no está definida.
Entiendo que a menudo hay peculiaridades con el alcance y la definición de variables cuando se usa un depurador interactivo, pero me parece que, según la especificación del lenguaje, debería haber una "mejor" solución para estas peculiaridades. Así que tengo mucha curiosidad si esto se debe a la optimización de Chrome más allá de Firefox. Y también si estas optimizaciones pueden deshabilitarse fácilmente durante el desarrollo (¿tal vez deberían deshabilitarse cuando las herramientas de desarrollo están abiertas?).
Además, puedo reproducir esto con puntos de interrupción, así como la debugger
declaración.
debugger;
línea en realidad no se llama desde adentro bar
. Observe el seguimiento de la pila cuando se detiene en el depurador: ¿se bar
menciona la función en el seguimiento de la pila? Si estoy en lo cierto, entonces el stacktrace debería decir que está en pausa en la línea 5, en la línea 7, en la línea 9.
temp1
adjunta una nueva variable global a la consola y puede usarla para acceder a la entrada del alcance.