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

推薦する

Nginx proxy_pass の / スラッシュによって引き起こされた殺人事件の詳細な説明

背景nginx サーバー モジュールは 2 つのサーバーにプロキシする必要があるため、異なるサーバー...

レスポンシブWebデザイン学習(1) - 画面サイズと使用率の決定

最近では、モバイルデバイスがますます普及しており、ユーザーがスマートフォンやタブレットを使用して W...

Ubuntu ベースのディストリビューションに Microsoft TrueType フォントをインストールするチュートリアル

Linux 上の LibreOffice で Microsoft ドキュメントを開くと、フォントが少...

RHCE ブリッジング、パスワード不要のログイン、ポート番号の変更の概要

目次1. ブリッジを設定し、検証のためにパケットをキャプチャする1. ブリッジデバイスとセッションを...

MySQL の CPU 負荷が高い問題のトラブルシューティング

MySQL による CPU 負荷の上昇今日の午後、MySQL によってサーバーの負荷が高くなる問題を...

Dockerコンテナでアプリケーションサービスを自動的に起動する方法の例

コンテナの起動時に Docker コンテナ内のアプリケーション サービスを自動的に起動する場合。 D...

Vueは携帯電話のカメラとアルバムを呼び出す機能を実装します

この記事では、携帯電話のカメラとアルバムにアクセスするためのVueの具体的なコードを参考までに共有し...

VMware WorkStation を Docker for Windows で使用するための詳細なチュートリアル

目次1. はじめに2. Windows用Dockerをインストールする1. Windows用Dock...

MySQLのグローバルロックとテーブルロックに関する詳細な理解

序文ロックの範囲に応じて、MySQL のロックは、グローバル ロック、テーブル ロック、行ロックに大...

Ubuntu 18.04 Linux システムに JDK と Mysql をインストールする方法

プラットフォームの展開1. JDKをインストールするステップ1. OracleJDKをダウンロードす...

CSS でフローティングにより親要素の高さが崩れる問題を解決するいくつかの方法

以前は、フロートはレイアウトによく使用されていましたが、フローティングレイアウトを使用すると親要素の...

nacos が mysql に接続できない場合の解決策

理由nacos の pom が依存する mysql バージョンが、mysql バージョンと一致してい...

UTF-8 および GB2312 ウェブエンコーディング

最近、多くの学生から Web ページのエンコーディングについて質問を受けています。gb2312 と ...

MySQLはデータベースのN+1クエリ問題を解決します

導入HibernateやMyBatisなどのORMフレームワークでは、部門に関連付けられたユーザーオ...

Vue2.0/3.0 での provide と inject の使用例

目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...