Avec ce code:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
J'obtiens ce résultat inattendu:
Quand je change le code:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
J'obtiens le résultat attendu:
De plus, s'il y a un appel à eval
l'intérieur de la fonction interne, je peux accéder à ma variable comme je veux (peu importe ce à quoi je passe eval
).
Pendant ce temps, les outils de développement de Firefox donnent le comportement attendu dans les deux cas.
Que se passe-t-il avec Chrome que le débogueur se comporte moins facilement que Firefox? J'ai observé ce comportement pendant un certain temps, jusqu'à la version 41.0.2272.43 bêta (64 bits) incluse.
Est-ce que le moteur javascript de Chrome "aplatit" les fonctions quand il le peut?
Fait intéressant si j'ajoute une deuxième variable qui est référencé dans la fonction intérieure, la x
variable est encore mal défini.
Je comprends qu'il y a souvent des bizarreries avec la portée et la définition de variable lors de l'utilisation d'un débogueur interactif, mais il me semble que sur la base de la spécification du langage, il devrait y avoir une «meilleure» solution à ces bizarreries. Je suis donc très curieux de savoir si cela est dû à l'optimisation de Chrome plus loin que Firefox. Et aussi si ces optimisations peuvent ou non être facilement désactivées pendant le développement (peut-être devraient-elles être désactivées lorsque les outils de développement sont ouverts?).
En outre, je peux reproduire cela avec des points d'arrêt ainsi que la debugger
déclaration.
debugger;
ligne n'est pas réellement appelée de l'intérieur bar
. Regardez donc la trace de la pile lorsqu'elle s'arrête dans le débogueur: la bar
fonction est-elle mentionnée dans la trace de pile? Si j'ai raison, alors le stacktrace devrait indiquer qu'il est mis en pause à la ligne 5, à la ligne 7, à la ligne 9.
temp1
est attachée à la console et vous pouvez l'utiliser pour accéder à l'entrée d'étendue.