forループ内のvarの問題の解決

forループ内のvarの問題の解決

序文

var は ES5 における変数宣言方法です。var で変数を宣言するとループ変数がグローバル変数に漏れる問題があると以前から聞いていましたが、この「グローバル」の影響がいつもわかりません。また、出力結果が増加/減少する値になる場合と、出力が同じ値になる場合が明確ではありません。

問題の再現

(var i = 1; i <= 5; i++) の場合 {
  setTimeout(関数タイマー() {
    コンソールログ(i)
  }, i * 1000)
}

予想される結果: 12345

印刷結果: 66666

解決

閉鎖

(var i = 1; i <= 5; i++) の場合 {
    (関数(j) {
        setTimeout(関数タイマー() {
            コンソールログ(j)
        }, j * 1000)
    })(私)
}

setTimeout 3番目のパラメータ

(var i = 1; i <= 5; i++) の場合 {
   タイムアウトを設定する(
       関数タイマー(j) {
           コンソールログ(j)
       },
       私 * 1000、
       私
   )
}

letを使ってiを定義する

(i = 1; i <= 5; i++ とします) {
    setTimeout(関数タイマー() {
        コンソールログ(i)
    }, i * 1000)
}

させて

let に関しては、現在の i はこのループ内でのみ有効であり、各ループ内の i は実際には新しい変数であることを覚えておいてください。

JavaScript エンジンは、前のループの値を内部的に記憶し、このループの変数 i を初期化するときに、前のループに基づいて計算を実行します。

さらに、 for ループにはもう一つ特別な機能があり、ループ変数を設定する部分が親スコープで、ループ本体が別の子スコープになります。

(i = 0; i < 3; i++ とします) {
i = 'abc' とします。
コンソールにログ出力します。
}
//abc
//abc
//abc

要約する

var for ループを使用する際に発生する問題を解決する方法についての記事はこれで終わりです。var for ループの問題の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • js for ループ、なぜ i 変数を定義するために var を追加する必要があるのか
  • jQuery for ループにおける var と let の違い
  • es6 for ループにおける let と var の違いの詳細な説明

<<:  Nginx のリロード プロセスの背後にある真実を探る

>>:  MySQL で特定の日、月、または年のデータをクエリするためのコードの詳細な説明

推薦する

MySQLの比較演算子正規表現マッチングREGEXPの使用の詳細な説明

1. データを初期化する `test_01` が存在する場合はテーブルを削除します。 テーブル「te...

Vueフィルターの詳細な説明

<本文> <div id="ルート"> <h2&...

CN2、GIA、CIA、BGP、IPLC はどういう意味ですか?

CN2ラインとは何ですか? CN2 は、China Telecom Next Carrier Ne...

歴史的な Linux 画像処理および修復ソリューション

従来の Linux イメージで作成された ECS クラウド サーバーには、NTP と YUM が設定...

誰もが知っておくべきウェブサイトのユーザビリティに関する 10 のヒント

これ以上時間を無駄にせず、早速本題に入りましょう。 1. ロゴに代替テキストを追加するこれには 2 ...

Linuxでファイルの作成時間を表示する方法

1. はじめにLinux でファイルの作成時刻が見つかるかどうかは、ファイル システムの種類によって...

MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...

Webpack で環境変数を使用するためのさまざまな正しい姿勢

目次前に書いてビジネスコードは環境変数を使用するwebpack.DefinePlugin プラグイン...

Vueプロジェクトを大画面に適応させる方法の例

レムの簡単な分析まず、remはCSS単位です。pxの固定ピクセル単位と比較すると、remはより柔軟性...

Ant Design Blazor コンポーネントライブラリのルーティング再利用マルチタブ機能

最近、Ant Design Blazor コンポーネント ライブラリにマルチタブ コンポーネントを実...

Centos7 での nginx のインストールと設定に関する詳細なチュートリアル

注: ソフトウェアのインストールの基本ディレクトリ パスは /usr/local です。ソフトウェア...

VMware12 で Ubuntu19.04 デスクトップ版をインストールする (インストール チュートリアル)

1. 実験の説明仮想マシンに、 Ubuntu 19.04オペレーティングシステムを手動でインストー...

DockerにRabbitMQを素早くインストールする方法

1. 画像を取得する #Webコントロールページを含むバージョンを指定します docker pull...

Webpack4プラグインの実装原理についての簡単な説明

目次序文知る練習すれば完璧になる序文wabpack では、ローダーの他にプラグインがコア機能です。プ...

ウェブページ制作でウェブフォントファイルにベクターアイコンを追加する方法

ご存知のとおり、コンピューターには 2 種類の画像があり、1 つはビットマップ、もう 1 つはベクタ...