1. ホーム
  2. javascript

[解決済み] JS変数の値(参照ではなく)を関数に渡すには?重複

2022-09-14 03:21:21

質問

以下は、私が実行しようとしているものの簡略版です。

for (var i = 0; i < results.length; i++) {
    marker = results[i];
    google.maps.event.addListener(marker, 'click', function() { 
        change_selection(i);
    }); 
}

を追加しましたが、すべてのリスナーがresults.lengthの値(forループが終了したときの値)を使用していることがわかりました。どうすれば、リスナーを追加するときに、iへの参照ではなく、iの値を使用するようにできますか?

どのように解決するのですか?

モダンブラウザでは let または const のキーワードでブロックスコープの変数を作成します。

for (let i = 0; i < results.length; i++) {
  let marker = results[i];
  google.maps.event.addListener(marker, 'click', () => change_selection(i));
}


古いブラウザでは、関数のパラメータとして渡すことで、現在の状態の変数を保存する別のスコープを作成する必要があります。

for (var i = 0; i < results.length; i++) {
  (function (i) {
    marker = results[i];
    google.maps.event.addListener(marker, 'click', function() { 
      change_selection(i);
    }); 
  })(i);
}

無名関数を作り、その変数を第一引数として呼び出すことで、関数に値渡しをしてクロージャを作成していることになります。