console.log
n'est pas standardisé, donc le comportement est plutôt indéfini et peut être changé facilement d'une version à l'autre des outils de développement. Votre livre sera probablement obsolète, comme ma réponse pourrait bientôt.
Pour notre code, cela ne fait aucune différence que ce console.log
soit asynchrone ou non, cela ne fournit aucun type de rappel ou autre; et les valeurs que vous transmettez sont toujours référencées et calculées au moment où vous appelez la fonction.
Nous ne savons pas vraiment ce qui se passe alors (OK, nous pourrions, puisque Firebug, Chrome Devtools et Opera Dragonfly sont tous open source). La console devra stocker les valeurs enregistrées quelque part et les affichera à l'écran. Le rendu se produira de manière asynchrone à coup sûr (étant limité aux mises à jour de limite de débit), tout comme les interactions futures avec les objets journalisés dans la console (comme l'expansion des propriétés d'objet).
Ainsi, la console peut soit cloner (sérialiser) les objets mutables que vous avez consignés, soit stocker des références à ceux-ci. Le premier ne fonctionne pas bien avec les objets profonds / grands. De plus, au moins le rendu initial dans la console montrera probablement l'état "actuel" de l'objet, c'est-à-dire celui lorsqu'il a été connecté - dans votre exemple que vous voyez Object {}
.
Cependant, lorsque vous développez l'objet pour inspecter davantage ses propriétés, il est probable que la console aura uniquement stocké une référence à votre objet et à ses propriétés, et les afficher maintenant affichera alors leur état actuel (déjà muté). Si vous cliquez sur +
, vous devriez pouvoir voir la bar
propriété dans votre exemple.
Voici une capture d'écran qui a été publiée dans le rapport de bogue pour expliquer leur «correctif»:
Ainsi, certaines valeurs peuvent être référencées longtemps après avoir été consignées, et leur évaluation est plutôt paresseuse («si nécessaire»). L'exemple le plus célèbre de cet écart est traité dans la question La console JavaScript de Chrome est-elle paresseuse pour évaluer les tableaux?
Une solution de contournement consiste à vous assurer de toujours consigner les instantanés sérialisés de vos objets, par exemple en faisant console.log(JSON.stringify(obj))
. Cela fonctionnera uniquement pour les objets non circulaires et plutôt petits. Voir aussi Comment puis-je changer le comportement par défaut de console.log dans Safari? .
La meilleure solution consiste à utiliser des points d'arrêt pour le débogage, où l'exécution s'arrête complètement et vous pouvez inspecter les valeurs actuelles à chaque point. Utilisez la journalisation uniquement avec des données sérialisables et immuables.