[解決済み】JavaScriptのクリックハンドラがforループの中で期待通りに動作しない【重複あり
2022-04-07 20:36:43
質問
私はJSを学ぼうとしていますが、問題が発生しました。
いろいろと試したり、ググったりしましたが、すべて無駄でした。以下のコードは期待通りに動きません。私はの値を取得する必要があります
i
をクリックすると、常に6が返されます。髪を引っ張り出しているところです。
for (var i = 1; i < 6; i++) {
console.log(i);
$("#div" + i).click(
function() {
alert(i);
}
);
}
解決方法は?
これは、JavaScriptの典型的なクロージャーの問題です。クロージャの
i
オブジェクトの実際の値ではなく、クリックハンドラークロージャに格納されています。
i
.
クリックハンドラはすべて同じオブジェクトを参照します。なぜなら、6を保持するカウンターオブジェクトは1つしかないので、クリックするたびに6を取得するからです。
回避策としては、これを無名関数でラップし、i を引数として渡します。プリミティブは関数呼び出しの際に値でコピーされます。
for(var i=1; i<6; i++) {
(function (i) {
$("#div" + i).click(
function () { alert(i); }
);
})(i);
}
アップデイト
または
'レット'
代わりに
var
を宣言します。
i
.
let
は、毎回新しいバインディングを与えます。これは ECMAScript 6 でのみ使用可能です。
strict mode
.
'use strict';
for(let i=1; i<6; i++) {
$("#div" + i).click(
function () { alert(i); }
);
}
関連
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】最大呼び出しスタックサイズ超過エラーとその修正方法とは?
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み】Uncaught TypeError: 未定義のプロパティ 'msie' を読み取れない - jQuery tools
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] React JSX内のループ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 Uncaught TypeError: data.push is not a function
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み] テスト
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】TypeError:res.jsonは関数ではありません。
-
[解決済み】TypeError: AngularJSで未定義のプロパティ'get'を読み取れない
-
[解決済み】module.exports "モジュールが定義されていません"
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー