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のインストールと使い方

推薦する

IE6/7 で絶対配置された要素が不可解に消えたりブロックされたりする問題を解決する方法

1. 絶対配置レイヤーの隣接フローティング レイヤーの幅が親レイヤーの幅と等しくなく、フロートがクリ...

VMware で Nginx+KeepAlived クラスタ デュアルアクティブ アーキテクチャを展開する際の問題と解決策

序文負荷分散には nginx を使用します。アーキテクチャのフロントエンドまたは中間層として、トラフ...

Vue3 での Teleport の使用に関する詳細な説明

目次テレポートの目的テレポートの仕組みこの記事では、以下の内容を取り上げます。テレポートの目的テレポ...

MySQL 8.0 のデフォルトのデータディレクトリを変更する (設定なしの簡単な操作)

使用シナリオ: Alibaba Cloud を使用しており、データディスクを別途購入しました (大容...

HTML の div と span の違い (共通点と相違点)

共通点: DIV タグと SPAN タグは、コンテンツ全体を非表示にしたり、コンテンツ全体を移動した...

MySQL マスタースレーブステータスチェックの実装

1. AデータベースとBデータベースの同期ステータスを確認する次のコマンドを入力すると多くの情報が表...

Docker 階層化パッケージを使用して Spring Boot を設定する方法

Spring Boot プロジェクトでは、Docker コンテナ、jar、war の階層化パッケージ...

WeChat アプレットのカスタム スクロール ビューのサンプル コード

ミニプログラムカスタムスクロールビュースクロールバーさっそくレンダリングを見てみましょうレンダリング...

CSS でのナビゲーション バーとドロップダウン メニューの実装

1. CSSナビゲーションバー(1)ナビゲーションバーの機能ナビゲーション バーを使いこなすことは、...

HTTPSの最も優れた説明

皆さんおはようございます。しばらく記事を更新していませんでした。実は、私は流行中に1か月以上家にいて...

Vue でユーザー権限に基づいてルートを動的に追加する方法

ユーザーの権限に応じて異なるメニュー ページを表示します。知識ポイントルートガード(事前ガードを使用...

rem をモバイル デバイスに適応させる方法の例

序文モバイル端末のREM適応ソリューションのレビューと概要remの使い方rem 単位の計算は、HTM...

Docker コンテナのネットワーク障害に対する 6 つの解決策

Docker コンテナのネットワーク障害に対する 6 つの解決策注: 以下の方法は、コンテナ内のパブ...

MySql 最適化のための my.ini 中国語構成スキームの詳細な説明: InnoDB、4GB メモリ、および複数のクエリ

この記事は、4G メモリ システム用の MySQL 構成ファイル ソリューションです (主に Inn...

Linux で開いているファイルが多すぎる問題を解決する方法

原因は、プロセスが特定の時点でシステム制限を超える数のファイルと通信リンクを開くことです。 システム...