console.log() は非同期ですか、それとも同期ですか?
P粉248602298
P粉248602298 2023-08-27 22:31:53
0
2
373
<p>現在、Trevor Burnham の「Async Javascript」を読んでいます。これはこれまでのところ素晴らしい本です。 </p> <p>彼は、このスニペットと console.log が Safari および Chrome コンソールで「非同期」であることについて話しています。残念ながらこれを再現することはできません。これはコードです: </p> <pre class="brush:php;toolbar:false;">var obj = {}; コンソール.ログ(obj); obj.foo = 'バー'; // 私の結果: Object{}; 'bar'; // 本の結果: {foo:bar};</pre> <p>これが非同期であれば、結果は本に記載されているとおりになると予想されます。 console.log() は、すべてのコードが実行されるまでイベント キューに置かれ、その後実行され、bar 属性を持ちます。 </p> <p>同期的に実行されているようですが。 </p> <p>このコードを実行するのは間違っていますか? console.log は実際には非同期ですか? </p>
P粉248602298
P粉248602298

全員に返信(2)
P粉141925181

console.log は標準化されていないため、動作はかなり未定義であり、開発者ツールの異なるバージョン間で簡単に変更される可能性があります。あなたの本は古くなっているかもしれませんし、私の答えもすぐに古くなってしまうかもしれません。

私たちのコードでは、console.log が非同期かどうかは関係なく、いかなる種類のコールバックも提供せず、関数を呼び出すときに渡された値が常に参照されて評価されます。

次に何が起こるかは実際のところわかりません (Firebug、Chrome Devtools、Opera Dragonfly はすべてオープンソースなので、それはわかります)。コンソールは、ログに記録された値をどこかに保存し、画面に表示する必要があります。レンダリングは間違いなく非同期で行われます (レート制限された更新の対象となります)。コンソールに記録されたオブジェクトとの将来の対話 (オブジェクト プロパティの拡張など) も同様です。

そのため、コンソールはログに記録された可変オブジェクトのクローン (シリアル化) を作成したり、それらのオブジェクトへの参照を保存したりすることがあります。最初の方法は、深いオブジェクトや大きなオブジェクトでは機能しません。また、少なくともコンソールの最初のレンダリングでは、オブジェクトの「現在の」状態、つまり記録時の状態が表示される可能性があります。この例では、Object {} が表示されます。

ただし、オブジェクトを展開してそのプロパティをさらに調べる場合、コンソールにはオブジェクトとそのプロパティへの参照のみが保存される場合があり、それらを表示すると現在の (変更された) 状態が表示されます。 をクリックすると、例の bar プロパティが表示されるはずです。

これは、「修正」を説明する バグレポート に投稿されたスクリーンショットです:

したがって、一部の値は記録されてからかなり時間が経つまで参照されない可能性があり、これらの値の評価はむしろ lazy (「必要なとき」) になります。この違いの最も有名な例は、Chrome の JavaScript コンソールは配列の遅延評価を処理しますか?という質問にあります。

回避策は、console.log(JSON.stringify(obj)) を実行するなどして、オブジェクトのシリアル化されたスナップショットが常にログに記録されるようにすることです。ただし、これは非円形でかなり小さいオブジェクトに対してのみ機能します。関連項目Safari で console.log のデフォルトの動作を変更するにはどうすればよいですか?

より良い解決策は、デバッグにブレークポイントを使用することです。これにより、実行が完全に停止し、各ポイントで現在の値を検査できます。ロギングは、シリアル化可能かつ不変のデータに対してのみ使用してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!