console.log
no está estandarizado, por lo que el comportamiento es bastante indefinido y se puede cambiar fácilmente de una versión a otra de las herramientas de desarrollo. Es probable que su libro esté desactualizado, al igual que mi respuesta pronto.
Para nuestro código, no importa si console.log
es asíncrono o no, no proporciona ningún tipo de devolución de llamada; y los valores que pasa siempre se referencian y calculan en el momento en que llama a la función.
Realmente no sabemos qué sucede entonces (de acuerdo, podríamos, ya que Firebug, Chrome Devtools y Opera Dragonfly son todos de código abierto). La consola necesitará almacenar los valores registrados en algún lugar y los mostrará en la pantalla. La renderización ocurrirá de forma asincrónica con seguridad (se limitará a actualizaciones de límite de velocidad), al igual que las interacciones futuras con los objetos registrados en la consola (como expandir las propiedades del objeto).
Entonces, la consola podría clonar (serializar) los objetos mutables que registró, o almacenará referencias a ellos. El primero no funciona bien con objetos grandes o profundos. Además, al menos la representación inicial en la consola probablemente mostrará el estado "actual" del objeto, es decir, el que se registró en el ejemplo que ve Object {}
.
Sin embargo, cuando expande el objeto para inspeccionar más sus propiedades, es probable que la consola solo haya almacenado una referencia a su objeto y sus propiedades, y mostrarlos ahora mostrará su estado actual (ya mutado). Si hace clic en +
, debería poder ver la bar
propiedad en su ejemplo.
Aquí hay una captura de pantalla que se publicó en el informe de errores para explicar su "solución":
Por lo tanto, es posible que se haga referencia a algunos valores mucho después de que se hayan registrado, y la evaluación de estos es bastante lenta ("cuando sea necesario"). El ejemplo más famoso de esta discrepancia se maneja en la pregunta ¿La consola JavaScript de Chrome es perezosa para evaluar matrices?
Una solución alternativa es asegurarse de registrar instantáneas serializadas de sus objetos siempre, por ejemplo, haciendo console.log(JSON.stringify(obj))
. Sin embargo, esto funcionará solo para objetos no circulares y bastante pequeños. Consulte también ¿Cómo puedo cambiar el comportamiento predeterminado de console.log en Safari? .
La mejor solución es utilizar puntos de interrupción para la depuración, donde la ejecución se detiene por completo y puede inspeccionar los valores actuales en cada punto. Utilice el registro solo con datos seriales e inmutables.