2016-06-01 9 views
16

Ich verwende Node Monkey, um meine NodeJS App zu debuggen.Chrome DevTools-Fehler: "Speichern in temporäre Variable fehlgeschlagen."

Wenn ich in meiner Chrome-Konsole auf "Als globale Variable speichern" klicke, wird häufig angezeigt, dass die Variable nicht in der temporären Variablen gespeichert werden konnte.

enter image description here

console.log({why:'dont', you:'work?'}) 

Es kommt auch in diesem jsfiddle

1) Bin ich falsch, etwas zu tun?

2) Warum passiert das?

Chrome: 50.0.2661.102 (64-bit) OSX El Capitan 10.11.4

Antwort

31

ich zwei Gründe sehen, warum Speicher als globales Variable nicht funktionieren würde:

1. Falscher Console Kontext Ausgewählte

Dies ist wohl ein Fehler Chrome, aber man kann nur ein Objekt speichern, wie Eine globale Variable, wenn die Konsole auf denselben Kontext eingestellt ist wie der Code, der das Objekt protokolliert hat.

In der Praxis bedeutet dies, dass Sie möglicherweise den richtigen IFrame oder Web Worker auswählen müssen.

Zum Beispiel auf jsFiddle:

Im normalen jsFiddle Editor Seitenkontext Ich erhalte eine Fehlermeldung.Aber es funktioniert, wenn ich den Kontext zu den Inhalten der Geige selbst ändern:

2. Garbage Collection

Damit Chrome Ihnen das Objekt einen Verweis zu geben, das Objekt noch muss in Erinnerung sein. Wenn das nicht der Fall ist, kann nur ein Fehler ausgelöst werden.

Allerdings bin ich ziemlich sicher, dass V8 in der Konsole angezeigt wird, um einen Verweis auf den Wert zu behalten.

+0

Danke! Es hilft mir (In meinem Fall musste ich einen "iframe" auswählen) –

+5

brilliant, es war die Nummer 2 für mich mit reaktiven nativen Debugger – Tope

4

Sie müssen das Objekt in der Konsole selbst erstellen, da die Referenz auf das Objekt von Chrome beibehalten werden muss. Folgendes in die Konsole nur setzen statt:

{why:'dont', you:'work?'} 

Console

Wenn Sie this revision herausfinden, wo die Funktion wurde hinzugefügt, heißt es:

Adding ability to access objects from printed ObjectPropertySections (console, scopes pane and etc.).

Das Problem, basierend auf meinem Verständnis, ist, dass console.log eine String-Repräsentation des Objekts ausgibt, und nur Objektformatierer verwendet, um es schön anzuzeigen. Das Objekt existiert nicht mehr. Wenn Sie ein Objekt über die Konsole selbst erstellen, speichert Chrome das Objekt selbst im Speicher. Wenn Sie an einem Haltepunkt pausiert haben und Variablen mit lokalem Bereich haben, können diese auch global gespeichert werden, da sie sich ebenfalls im Speicher befinden.

Eine Sache, die Sie in Ihrem Code tun können, wenn Sie nicht zirkuläre Referenzen bekommen haben ist:

console.log(JSON.stringify({why:'dont', you:'work?'})); 
> {"why":"dont","you":"work?"} 

in der Konsole die Ausgabe kopieren und in einen JSON.parse Aufruf einzufügen:

JSON.parse('{"why":"dont","you":"work?"}'); 
> Object {why: "dont", you: "work?"} 

Die Variable existiert jetzt im Speicher, sodass Sie sie speichern können.

+0

Vielen Dank für Ihre Antwort! Es funktioniert, aber ich normalerweise "Store als globale Variable" auch ein Objekt mit einer console.log gedruckt, zum Beispiel kann ich das Objekt von dieser HTML-Seite gedruckt speichern: