Com este código:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Eu recebo este resultado inesperado:
Quando eu mudo o código:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Eu recebo o resultado esperado:
Além disso, se houver alguma chamada para eval
dentro da função interna, eu posso acessar minha variável como desejo (não importa para o que eu passo eval
).
Enquanto isso, as ferramentas de desenvolvimento do Firefox fornecem o comportamento esperado nas duas circunstâncias.
O que há com o Chrome que o depurador se comporte menos do que o Firefox? Eu observo esse comportamento há algum tempo, incluindo a versão 41.0.2272.43 beta (64 bits).
Será que o mecanismo javascript do Chrome "nivela" as funções quando pode?
Curiosamente, se eu adicionar uma segunda variável que é referenciada na função interna, a x
variável ainda está indefinida.
Entendo que muitas vezes existem peculiaridades com escopo e definição de variável ao usar um depurador interativo, mas parece-me que, com base na especificação da linguagem, deve haver uma "melhor" solução para essas peculiaridades. Portanto, estou muito curioso se isso se deve à otimização do Chrome para além do Firefox. E também se essas otimizações podem ou não ser facilmente desabilitadas durante o desenvolvimento (talvez elas devam ser desabilitadas quando as ferramentas de desenvolvimento estão abertas?).
Além disso, eu posso reproduzir isso com pontos de interrupção e com a debugger
declaração.
debugger;
linha não é realmente chamada de dentro bar
. Portanto, observe o rastreamento de pilha quando ele pausa no depurador: a bar
função é mencionada no stacktrace? Se eu estiver certo, o stacktrace deve dizer que está pausado na linha 5, na linha 7, na linha 9.
temp1
é anexada ao console e você pode usá-la para acessar a entrada do escopo.