JavaScript 開発者として、効率的なコードを作成するには、言語がメモリ管理や非同期コード実行などのタスクをどのように処理するかを理解することが重要です。今日は、JavaScript のエンジンがどのようにコードを最適化し、メモリを管理するかについて詳しく説明するとともに、そのシングルスレッド、非同期の性質についても探っていきます。
インライン キャッシュとコードの最適化
最適化に関しては、コンパイラはインライン キャッシュなどの手法を使用してコードを高速化します。これを効率的に機能させるには、コードが人間だけでなくマシンにとっても予測可能である必要があります。コンパイラがコードを最適化できるようにするには、eval()、引数、for in、delete、with などの特定の組み込みキーワードを避けることが最善です。これらのキーワードにより隠しクラスが導入される可能性があり、コンパイラーのコード最適化機能が低下します。
コールスタックとメモリヒープ
JavaScript は、コール スタックとメモリ ヒープという 2 つの主要コンポーネントを使用してコードを実行します。
メモリ ヒープは、すべての値とオブジェクトがランダムな順序で保存される場所です。
コール スタックは、先入れ後出し (FILO) パターンに従って、現在実行されている関数を追跡します。
開発者が直面する一般的な問題の 1 つは、関数がループを中断せずにそれ自体を再帰的または繰り返し呼び出すときに発生するスタック オーバーフローです。ブラウザは最終的にメモリ不足になり、クラッシュします。
サンプル コード スニペット: スタック オーバーフローの例
function recursiveFunction() { return recursiveFunction(); // This will cause a stack overflow } recursiveFunction();
この例では、関数が終了せずにそれ自体を呼び出し続けるため、呼び出しスタックがいっぱいになり、スタック オーバーフローが発生します。
ガベージ コレクションとメモリ リーク
JavaScript はガベージ コレクション言語です。つまり、未使用の変数とオブジェクトがメモリ ヒープから自動的に削除されます。このプロセスはマーク アンド スイープ アルゴリズムによって処理され、C などの言語とは異なり、JavaScript ではメモリ管理を手動で制御できません。この自動プロセスにより作業は簡単になりますが、メモリ リークにつながる可能性のあるよくある間違いがあります。
メモリリークの一般的な原因:
グローバル変数: 決してクリーンアップされないグローバル変数を宣言すると、それらはメモリ内に残ります。
イベント リスナー: 不要になったイベント リスナーを削除しないと、メモリがいっぱいになる可能性があります。
setTimeout 関数: イベント リスナーと同様に、setTimeout を使用後にクリアしないと、メモリ リークが発生する可能性があります。
シングルスレッドおよび非同期実行
JavaScript はシングルスレッドの同期言語であり、一度に 1 つのタスクを処理できます。制限があるように思えるかもしれませんが、JavaScript は非同期タスクの処理に関しても強力です。
その仕組みは次のとおりです:
JavaScript は、ネットワーク リクエストなどの非同期タスクを検出すると、それを (ブラウザー内の) Web API に送信します。
非同期タスクがバックグラウンドで処理されている間、同期コードは実行を続けます。
非同期タスクが完了すると、結果がコールバック キューにプッシュされます。
コール スタックが空の場合、JavaScript はコールバック キューから結果を取得し、それをコール スタックにプッシュして実行します。
このようにして、JavaScript は単一スレッドで実行されている場合でも、ページをフリーズさせることなく HTTP リクエストなどのタスクを処理できます。
コード スニペット例: 非同期コード実行
console.log('Start'); setTimeout(() => { console.log('Async Task Complete'); }, 3000); // This runs after 3 seconds, but JS doesn't block the next line console.log('End');
この例では、「Async Task Complete」というメッセージが 3 秒後に表示されますが、非同期タスクがバックグラウンドで実行されているため、すぐに「End」が出力されます。
Node.js と JavaScript ランタイム
2009 年に Node.js が登場する前は、JavaScript はブラウザ内でのみ実行できました。 Ryan Dahl によって作成された Node.js を使用すると、JavaScript をブラウザ外で実行できます。 Node.js は C を使用して構築され、V8 エンジン (Chrome で JavaScript を実行するのと同じエンジン) を使用してタスクを処理します。ノンブロッキング I/O とシングルスレッドの性質で知られており、複数のスレッドを使用せずに複数のタスクを同時に処理します。
Node.js はシングルスレッドのノンブロッキング アーキテクチャの概念を導入し、他の操作をブロックすることなく I/O 操作 (ファイル読み取りなど) を効率的に処理できるようにしました。
以上がJavaScript をマスターする: メモリ管理と非同期実行で落とし穴を回避するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。