私はいくつかの一般的なjavascriptプログラムを探しています。以下の1は1と機能2は、ボタンにイベントリスナーを追加し、完璧に動作の両方の機能 javascript addEventListenerが期待どおりに機能しない
for(var i =0;i<5;i++){
var btn = document.createElement('button');
btn.appendChild(document.createTextNode('Button' + i));
//function 1
(function(i){
btn.addEventListener('click', function(){console.log(i)});
})(i);
//function 2 commented
/*btn.addEventListener('click', (function(i){
return function(){
console.log(i);
}
})(i));*/
document.body.appendChild(btn);
}
DOMに4つのボタンを追加し、それらのそれぞれにイベントリスナーを追加します。私は知りたいのですが、なぜ次のコードはそうしないのですか? -
for(var i =0;i<5;i++){
var btn = document.createElement('button');
btn.appendChild(document.createTextNode('Button' + i));
btn.addEventListener('click', function(){
console.log('Clicked' + i);
});
document.body.appendChild(btn);
}
このコードは、クリックするたびに5つのログを記録します。それはなぜですか、なぜ私は各ループのiの値を保持していないのか分かりません。
i
の値を結合さfor-loop
内の関数を作成している3番目の例では、ループが終了するまで待ってから、繰り返しの最大値をクリックします。 – InferOn
ループ内の[JavaScriptクロージャーの可能な重複 - 単純な実用的な例](http://stackoverflow.com)/question/750486/javascript-closure-inside-loops-simple-practical-example) – jisoo