Mit diesem Code:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Ich bekomme dieses unerwartete Ergebnis:
Wenn ich den Code ändere:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Ich bekomme das erwartete Ergebnis:
Wenn eval
innerhalb der inneren Funktion ein Aufruf erfolgt , kann ich auf meine Variable zugreifen, wie ich möchte (unabhängig davon, an was ich übergebe eval
).
In der Zwischenzeit geben die Firefox-Entwicklungstools unter beiden Umständen das erwartete Verhalten wieder.
Was ist mit Chrome los, dass sich der Debugger weniger bequem verhält als Firefox? Ich habe dieses Verhalten seit einiger Zeit bis einschließlich Version 41.0.2272.43 Beta (64-Bit) beobachtet.
Ist es so, dass die Javascript-Engine von Chrome die Funktionen "abflacht", wenn dies möglich ist?
Interessanterweise ist die x
Variable immer noch undefiniert, wenn ich eine zweite Variable hinzufüge, auf die in der inneren Funktion verwiesen wird.
Ich verstehe, dass es bei der Verwendung eines interaktiven Debuggers häufig Macken mit Umfang und Variablendefinition gibt, aber es scheint mir, dass es basierend auf der Sprachspezifikation eine "beste" Lösung für diese Macken geben sollte. Ich bin also sehr gespannt, ob dies daran liegt, dass Chrome weiter optimiert als Firefox. Und auch, ob diese Optimierungen während der Entwicklung leicht deaktiviert werden können oder nicht (sollten sie möglicherweise deaktiviert werden, wenn Entwickler-Tools geöffnet sind?).
Ich kann dies auch mit Haltepunkten sowie der debugger
Anweisung reproduzieren .
debugger;
Leitung nicht von innen aufgerufen wird bar
. Schauen Sie sich also den Stack-Trace an, wenn er im Debugger angehalten wird: Wird die bar
Funktion im Stacktrace erwähnt? Wenn ich recht habe, sollte der Stacktrace sagen, dass er in Zeile 5, in Zeile 7, in Zeile 9 angehalten ist.
temp1
wird an die Konsole angehängt und Sie können damit auf den Bereichseintrag zugreifen.