JavaScriptの無限ループを検出して防止する方法の詳細な説明

JavaScriptの無限ループを検出して防止する方法の詳細な説明

序文

Js デッド ループはどのようにして発生しますか?実際、コードを書くときに注意を払わなかったり、何かを見逃したりすると、次のコードに示すように、無限ループを記述することになります。

i++ が書かれていない場合、これは無限ループです。無限ループの結果を知りたい場合は、自分で試してみるのもよいでしょう。

無限ループとは、ループを終了できない不正な条件を持つ JavaScript コードです。

無限ループは、コードを実行している環境 (ブラウザーまたは NodeJS サーバー) でコンピューターがクラッシュまたはフリーズし、応答が停止する可能性があるため、危険です。

for 文と while 文は無限ループの一般的な原因であるため、このチュートリアルでは、これらの文によって発生する無限ループを検出して修正する方法を説明します。

まず、 for ステートメント内の無限ループを修正しましょう。

for文の無限ループを修正

for 文では、2 番目の式 (条件式) に比較演算子ではなく代入演算子を誤って配置すると、無限ループが発生する可能性があります。

以下は、無限ループが発生する for ステートメントの例です。 2 番目の式では i = 10 となっていることに注意してください。

(i = 0; i = 10; i++ とします) {
  console.log("無限ループ");
}

for ステートメントでは、ループを終了するために 2 番目の式が false と評価される必要があります。上記の例では、i < 10 や i > 10 のような比較演算子の代わりに、代入演算子 i = 10 が条件式として配置されています。

代入演算子は常に true と評価されるため、for ステートメントはコンソールに「無限ループ」の出力を停止せず、コンピューターがフリーズする可能性があります。

上記の for ステートメントを修正するには、2 番目の式を for ステートメントで到達可能なものに置き換える必要があります。例としては、比較演算子(=<、<、>、>=)の使用が挙げられます。

// 2番目の式は<に置き換えられます
(i = 0; i < 10; i++ とします) {
  console.log("無限ループ");
}

同じエラーの別のバージョンがあります。今回は、最初の式と 2 番目の式によって無限ループが発生します。

(i = 5; i > 0; i++ とします) {
  console.log("無限ループ");
}

上記のコードからわかるように、変数 i が 0 より大きい限りループは継続されます。

i の値は初期化時にすでに 0 より大きいため、2 番目の式は常に true と評価され、無限ループが発生します。

上記のコードを修正するには、3 番目の式で i の値を増分するのではなく減分する必要があります。

(i = 5; i > 0; i--とします) {
  console.log("無限ループ");
}

無限ループが発生する可能性がある for ステートメントの別の例は、次のように括弧内の 3 つの式がすべて省略されている場合です。

のために (;;) {
  console.log("無限ループ");
}

ただし、上記のコードは意図的にのみ記述する必要があるため、コンピューターをクラッシュさせたくない場合は、プロジェクトで使用しないでください。

実際に記述する for ステートメントは上記の例よりも確かに複雑になりますが、同じ原則を使用して for ステートメント内のエラーを見つけて修正することができます。

まず、for ステートメント内に配置する 2 番目の式が実際に false と評価されることを確認する必要があります。

2 番目の式が正しい場合は、1 番目と 3 番目の式のチェックを開始します。最初の式は、2 番目の式が実行されたときに常に true と評価される値を初期化しますか?

最後に、3 番目の式は、最初の式で初期化された変数の値を正しく増分または減分しますか?

要約すると、まず 2 番目の式をチェックし、次に 1 番目と 3 番目の式をこの順序でチェックします。

次に、while ステートメントによって発生する無限ループを修正する方法を学びましょう。

while文の無限ループを修正

while ステートメントでは、括弧内の条件式が常に true と評価される場合、無限ループが発生する可能性があります。

(真)の間{
  console.log("無限ループ");
}

無限ループを防ぐには、while ステートメントの条件式が false と評価される必要があります。

while ステートメントを書くときに最もよくある間違いの 1 つは、条件式で使用される変数の値を変更することを忘れることです。

次の例では、 の値が never どのように変化しないかに注意してください。

i = 0 とします。
 
(i < 6) の間 {
  console.log("無限ループ");
}

ループの実行時に条件式が false と評価されるように、while ステートメントの本体内で i の値を増分する必要があります。

i = 0 とします。
 
(i < 6) の間 {
  console.log("無限ループ");
  私は++;
}

while ステートメントがどんなに複雑であっても、while() 括弧内の条件式が false と評価されることを確認する必要があります。

それでも無限ループの原因がわからない場合は、console.log() ステートメントを使用して、条件式で使用される変数の値を出力できます。

i = 0 とします。
 
(i < 6) の間 {
  console.log("無限ループ");
  私は++;
  コンソールにログ出力します。
}

コンソール ログは、エラーのあるコード行を特定して修正するのに役立ちます。

要約する

JavaScript の無限ループを検出して防止する方法についての記事はこれで終わりです。js の無限ループを検出して防止する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript で無限ループを検出する方法(例付き)

<<:  CSS により、子コンテナが親要素を超えます (子コンテナは親コンテナ内で浮動します)

>>:  Ubuntu Dockerのインストールと使い方

推薦する

インデックスを使用して数千万のデータを持つ MySQL のクエリ速度を最適化する

1. インデックスの役割一般的に言えば、インデックスは本の目次に相当します。条件に基づいてクエリを実...

CentOS 8 VMware 仮想マシンがインターネットにアクセスするための静的 IP ネットワーク カードの設定の詳細な説明

最初のステップ: VMwareで、「編集」-「仮想ネットワークエディタ」をクリックします。下図に示す...

Vueのハッシュジャンプ原理の詳細な説明

目次ハッシュと履歴の違いハッシュ履歴getCurrentLocation の実装setupListe...

Vue で video.js を使用して m3u8 形式のビデオを再生する方法

目次1. インストール2. videojsの紹介3. コンポーネントでのテストと使用1. 基本的な自...

mysql5.7.14 解凍版インストールと設定方法 グラフィックチュートリアル (win10)

Win10はmysql5.7の解凍版をインストールします。参考までに、具体的な内容は次のとおりです...

CentOS7.5 MySQLのインストールチュートリアル

1. まずシステムにmysqlがインストールされているかどうかを確認します rpm -qa | gr...

Linuxの運用と保守、基本的なプロセス管理、リアルタイム監視と制御

目次1. バックグラウンドで実行されるジョブ2. 信号を使用してプロセスを制御する基本的なプロセス管...

設定ファイルを書いてMyBatisを簡単に使う方法

設定ファイルを書いてMyBatisを簡単に使う方法マイバティス3.xここでは MyBatis につい...

Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します

第1章: keepalivedの紹介VRRP プロトコルの目的は、静的ルーティングの単一点障害問題を...

MYSQL row_number() および over() 関数の詳細な使用方法

構文フォーマット: row_number() over(partition by grouping ...

Html/Css (初心者が最初に読むべきガイド)

1. Web標準の意味を理解する - なぜWeb標準を採用するのか***** コンテンツとスタイル...

CSS ピックアップ矢印、カタログ、アイコン実装コード

1. CSS その他のアイコンアイコンを作成するには 3 つの方法があります。写真css (小さな矢...

docker-compose を使用して MySQL を実行する方法

ディレクトリ構造 。 │ .env │ docker-compose.yml │ └─mysql ├...

JavaScript の setTimeout と setTimeinterval の使用例の説明

どちらの方法も、一定時間後に JavaScript コードを実行するために使用できますが、それぞれに...

Reactソースコードにおけるビット演算について詳しく説明します

目次序文いくつかの一般的なビット操作ビットAND (&)ビットOR (|)ビット否定(~)マ...