Con questo codice:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Ottengo questo risultato inaspettato:
Quando cambio il codice:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Ottengo il risultato atteso:
Inoltre, se c'è qualche chiamata eval
all'interno della funzione interna, posso accedere alla mia variabile come voglio fare (non importa a cosa passo eval
).
Nel frattempo, gli strumenti di sviluppo di Firefox forniscono il comportamento previsto in entrambe le circostanze.
Che succede con Chrome che il debugger si comporta in modo meno conveniente di Firefox? Ho osservato questo comportamento per qualche tempo, fino alla versione 41.0.2272.43 beta inclusa (64 bit).
Il motore javascript di Chrome "appiattisce" le funzioni quando può?
È interessante notare che se aggiungo una seconda variabile a cui fa riferimento la funzione interna, la x
variabile è ancora indefinita.
Capisco che ci sono spesso stranezze con ambito e definizione variabile quando si utilizza un debugger interattivo, ma mi sembra che in base alle specifiche del linguaggio ci dovrebbe essere una "migliore" soluzione a queste stranezze. Quindi sono molto curioso di sapere se ciò è dovuto all'ottimizzazione di Chrome oltre a Firefox. E anche se queste ottimizzazioni possono essere facilmente disabilitate durante lo sviluppo (forse dovrebbero essere disabilitate quando gli strumenti di sviluppo sono aperti?).
Inoltre, posso riprodurlo sia con punti di interruzione che con l' debugger
affermazione.
debugger;
linea non è effettivamente chiamata dall'interno bar
. Quindi guarda la traccia dello stack quando si mette in pausa nel debugger: la bar
funzione è menzionata nello stacktrace? Se ho ragione, allora lo stacktrace dovrebbe dire che è in pausa alla riga 5, alla riga 7, alla riga 9.
temp1
è collegata alla console ed è possibile utilizzarla per accedere alla voce dell'ambito.