console.log
não é padronizado, portanto, o comportamento é bastante indefinido e pode ser alterado facilmente de uma versão para outra das ferramentas de desenvolvedor. É provável que seu livro esteja desatualizado, assim como minha resposta em breve.
Para o nosso código, não faz diferença se console.log
é assíncrono ou não, não fornece nenhum tipo de retorno de chamada ou algo assim; e os valores que você passa são sempre referenciados e calculados no momento em que você chama a função.
Não sabemos realmente o que acontece então (OK, poderíamos, já que Firebug, Chrome Devtools e Opera Dragonfly são todos de código aberto). O console precisará armazenar os valores registrados em algum lugar e os exibirá na tela. A renderização acontecerá de forma assíncrona com certeza (sendo estrangulada para atualizações de limite de taxa), assim como as futuras interações com os objetos registrados no console (como propriedades de objeto em expansão).
Portanto, o console pode clonar (serializar) os objetos mutáveis que você registrou ou armazenar referências a eles. O primeiro não funciona bem com objetos grandes / profundos. Além disso, pelo menos a renderização inicial no console provavelmente mostrará o estado "atual" do objeto, ou seja, aquele quando ele foi logado - no seu exemplo, você vê Object {}
.
No entanto, quando você expande o objeto para inspecionar ainda mais suas propriedades, é provável que o console tenha armazenado apenas uma referência ao seu objeto e suas propriedades, e exibi-los agora mostrará seu estado atual (já alterado). Se você clicar em +
, deverá ver a bar
propriedade em seu exemplo.
Aqui está uma captura de tela que foi postada no relatório de bug para explicar sua "correção":
Portanto, alguns valores podem ser referenciados muito tempo depois de terem sido registrados, e a avaliação deles é bastante lenta ("quando necessário"). O exemplo mais famoso dessa discrepância é tratado na pergunta O console JavaScript do Chrome tem preguiça de avaliar arrays?
Uma solução alternativa é certificar-se de registrar instantâneos serializados de seus objetos sempre, por exemplo, fazendo console.log(JSON.stringify(obj))
. No entanto, isso funcionará apenas para objetos não circulares e pequenos. Veja também Como posso alterar o comportamento padrão do console.log no Safari? .
A melhor solução é usar pontos de interrupção para depuração, onde a execução para completamente e você pode inspecionar os valores atuais em cada ponto. Use o registro apenas com dados serializáveis e imutáveis.