Warum macht Chrome-debugger denke geschlossenen lokalen variable nicht definiert ist?

Mit diesem code:

function baz() {
  var x = "foo";

  function bar() {
    debugger;
  };
  bar();
}
baz();

Komme ich zu diesem unerwarteten Ergebnis:

Warum macht Chrome-debugger denke geschlossenen lokalen variable nicht definiert ist?

Wenn ich den code ändern:

function baz() {
  var x = "foo";

  function bar() {
    x;
    debugger;
  };
  bar();
}

Bekomme ich das erwartete Ergebnis:

Warum macht Chrome-debugger denke geschlossenen lokalen variable nicht definiert ist?

Auch, wenn es keinen Aufruf zu eval innerhalb der inneren Funktion, ich kann auf meine variable, die ich tun will (egal was ich pass auf eval).

Mittlerweile Firefox-dev-tools geben, die das erwartete Verhalten in beiden Fällen.

Was ist mit Chrome, dass der debugger verhält sich weniger günstig als Firefox? Ich habe beobachtet, dieses Verhalten für einige Zeit, bis zu und einschließlich der Version 41.0.2272.43 beta (64-bit).

Ist es, dass die Chrome-javascript-engine "verflacht" die Funktionen aus, wenn Sie es können?

Interessanterweise, wenn ich, fügen Sie eine zweite variable, die ist verwiesen, in der die innere Funktion, die x variable ist noch nicht definiert.

Ich verstehen, dass es oft Macken mit scope und Variablen definition bei Verwendung eines interaktiven debugger, aber es scheint mir, dass auf der Grundlage der Sprach-Spezifikation soll es eine "beste" Lösung für diese Macken. Also ich bin sehr gespannt, ob dies aufgrund der Chrome-Optimierung weiter als Firefox. Und auch, ob oder nicht diese Optimierungen können problemlos deaktiviert werden, während der Entwicklung (vielleicht sollten Sie deaktiviert werden, wenn die dev tools öffnen?).

Ich auch reproduzieren können, das mit den breakpoints sowie die debugger - Anweisung.

vielleicht wird es un-verwendete Variablen aus dem Weg für Sie...
markle976 scheint zu sagen die debugger; Linie ist nicht eigentlich als von innen bar. So suchen Sie in der Stapel-Ablaufverfolgung, wenn es Pausen im debugger: Ist die bar Funktion erwähnt, in der stacktrace? Wenn ich Recht habe, dann ist der stacktrace sollte sagen, es ist Pause an Linie 5, Linie 7, Linie 9.
Ich glaube nicht, dass es nichts zu tun hat mit V8 Abflachung Funktionen. Ich denke, das ist nur eine Macke; ich weiß nicht, ob ich würde sogar sagen ein bug. Ich denke, dass David die Antwort von unten am meisten Sinn macht.
siehe auch garbage-collection, mit node.js, Wie sind Schließungen und Bereiche dargestellt, die zur Laufzeit in JavaScript und Über Verschluss, LexicalEnvironment und GC
Ich habe das gleiche Problem, ich hasse es. Aber wenn ich zugreifen müssen, Verschluss-Einträge in der Konsole, ich gehe dorthin, wo Sie sehen können, den Anwendungsbereich, finden die Closure Eintrag aus und öffnen Sie es. Dann mit der rechten Maustaste auf das element, das Sie brauchen, und klicken Sie auf Speichern als Globale Variable. Eine neue Globale variable temp1 wird an der Konsole und Sie können es verwenden, um Zugriff auf das scope-Eintrag.

InformationsquelleAutor Gabe Kopley | 2015-02-07

Schreibe einen Kommentar