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 で特定の日、月、または年のデータをクエリするためのコードの詳細な説明

推薦する

HTML の小さなタグの使用に関するヒント

<em></em> などのフレーズ要素を使用すると、意図した視覚スタイルを維...

ホームページのデザインはウェブデザイナーのレベルを最もよく反映する

私がこれまで携わってきた多くのプロジェクトでは、基本的に避けられない悪循環がありました。それは、ホー...

Reactでファイルパスエイリアスを素早く設定する方法

React は、ユーザー インターフェイスを構築するための JavaScript ライブラリです。F...

Ubuntu は、Mysql+Keepalived の高可用性実装 (デュアルアクティブ ホットスタンバイ) を構築します。

Mysql5.5 デュアルマシン ホットスタンバイ実装 2つのMySQLをインストールするMySQ...

Vue は URL に基づいて非同一オリジンのファイルをどのようにダウンロードするのか

一般的に、URL に基づいてファイルをダウンロードする場合、次の 2 つの解決策があります。 1. ...

Linux で圧縮ファイルの内容を表示する 10 の方法 (要約)

一般的に、アーカイブされたファイルや圧縮されたファイルの内容を表示するには、まず解凍してから表示する...

HTML ページでギリシャ文字を使用する方法

ギリシャ文字は、特に数学や物理学などの科学技術分野で非常によく使用される記号列であり、特定の意味を持...

HTMLの水平線注釈とコードコメントの使い方をマスターするだけです

水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...

DockerはClickHouseをインストールし、データテストを初期化します

クリックハウスの紹介ClickHouse は、SQL クエリを使用して分析データ レポートをリアルタ...

この記事ではCSSボーダーの使い方を説明します

境界線のスタイルborder-style プロパティは、表示する境界線の種類を指定します。 bord...

CentOS 7 は Hadoop 2.10 の高可用性 (HA) をビルドします

この記事では、CentOS 7 で高可用性 Hadoop 2.10 クラスターを構築する方法を紹介し...

WeChatアプレットがテキストスクロールを実装

この記事の例では、WeChatアプレットでテキストスクロールを実装するための具体的なコードを参考まで...

MySQL B-Tree インデックスの簡単な分析

Bツリーインデックス異なるストレージ エンジンでは、異なるストレージ構造を使用する場合もあります。た...

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

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

SQLデータベースの14の事例の紹介

データシート /* Navicat SQLite データ転送 ソースサーバー: school ソース...