console.log
ist nicht standardisiert, daher ist das Verhalten eher undefiniert und kann leicht von Release zu Release der Entwicklertools geändert werden. Ihr Buch ist wahrscheinlich veraltet, ebenso wie meine baldige Antwort.
Für unseren Code macht es keinen Unterschied, ob er console.log
asynchron ist oder nicht, er bietet keinerlei Rückruf oder so; und die Werte, die Sie übergeben, werden immer zum Zeitpunkt des Aufrufs der Funktion referenziert und berechnet.
Wir wissen nicht wirklich, was dann passiert (OK, wir könnten, da Firebug, Chrome Devtools und Opera Dragonfly alle Open Source sind). Die Konsole muss die protokollierten Werte irgendwo speichern und zeigt sie auf dem Bildschirm an. Das Rendern wird mit Sicherheit asynchron erfolgen (gedrosselt, um Aktualisierungen mit Ratenbegrenzung durchzuführen), ebenso wie zukünftige Interaktionen mit den protokollierten Objekten in der Konsole (wie das Erweitern von Objekteigenschaften).
Die Konsole kann also entweder die veränderlichen Objekte, die Sie protokolliert haben, klonen (serialisieren) oder Verweise darauf speichern. Der erste funktioniert nicht gut mit tiefen / großen Objekten. Zumindest beim ersten Rendern in der Konsole wird wahrscheinlich der "aktuelle" Status des Objekts angezeigt, dh der, als es protokolliert wurde - in Ihrem Beispiel sehen Sie Object {}
.
Wenn Sie das Objekt jedoch erweitern, um seine Eigenschaften weiter zu untersuchen, hat die Konsole wahrscheinlich nur einen Verweis auf Ihr Objekt und seine Eigenschaften gespeichert. Wenn Sie diese jetzt anzeigen, wird der aktuelle (bereits mutierte) Status angezeigt. Wenn Sie auf klicken +
, sollte die bar
Eigenschaft in Ihrem Beispiel angezeigt werden.
Hier ist ein Screenshot, der im Fehlerbericht veröffentlicht wurde , um deren "Fix" zu erklären:
Daher werden einige Werte möglicherweise lange nach der Protokollierung referenziert, und die Auswertung dieser Werte ist eher träge ("bei Bedarf"). Das bekannteste Beispiel für diese Diskrepanz ist die Frage, ob die JavaScript-Konsole von Chrome bei der Bewertung von Arrays faul ist.
Eine Problemumgehung besteht darin, sicherzustellen, dass serialisierte Snapshots Ihrer Objekte immer protokolliert werden, z console.log(JSON.stringify(obj))
. Dies funktioniert jedoch nur für nicht kreisförmige und eher kleine Objekte. Siehe auch Wie kann ich das Standardverhalten von console.log in Safari ändern? .
Die bessere Lösung besteht darin, Haltepunkte für das Debuggen zu verwenden, bei denen die Ausführung vollständig gestoppt wird und Sie die aktuellen Werte an jedem Punkt überprüfen können. Verwenden Sie die Protokollierung nur mit serialisierbaren und unveränderlichen Daten.