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 evalinnerhalb 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 xVariable 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 debuggerAnweisung 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 barFunktion 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.
temp1wird an die Konsole angehängt und Sie können damit auf den Bereichseintrag zugreifen.

