js for循環出力iは同じ値の問題です.
1879 ワード
1、最近開発中に問題があったのですが、どうして毎回出力は5で、各pをクリックするのではなく、alertに対応する1、2、3、4、5をクリックします.
コードは以下の通りです
理由:jsイベントプロセッサはオンラインアイドル時間が動作しないため、最後の運転時に出力されるのはiの最後の値です.すなわち、5
2、解決方法:クローズドパックを使って変数iの値を保護します.
//sava 1:一層のクローズドを加え、iは関数パラメータ形式で内部関数に伝達する.
コードは以下の通りです
1
2
3
4
5
window.οnlοad=function() {
var ps = document.getElementsByTagName("p");
for( var i=0; i<ps.length; i++ ) {
ps[i].onclick = function() {
alert(i);
}
}
}
この時任意のpをクリックしてポップアップしたのは全部5です.理由:jsイベントプロセッサはオンラインアイドル時間が動作しないため、最後の運転時に出力されるのはiの最後の値です.すなわち、5
2、解決方法:クローズドパックを使って変数iの値を保護します.
//sava 1:一層のクローズドを加え、iは関数パラメータ形式で内部関数に伝達する.
for( var i=0; i
//save 2:一層のクローズドを加えて、iは部分変数形式でメモリ関数に伝達する. for( var i=0; i
//save 3:一層のクローズドを加え、応答イベントとして関数を返します(3との微妙な違いに注意してください).for( var i=0; i
//save 4:各段落オブジェクト(p)に変数iを保存します. for( var i=0; i
//save 5:変数iを匿名関数自体に保存する for( var i=0; i
//save 6:Functionで実装されていますが、実際には関数インスタンスを生成するごとに一つのクローズドが発生します. for( var i=0; i
//save 7:Functionで実現します.6との違いに注意してください. for( var i=0; i
//save 8:ES 6のLetを使って完璧に解決するfor( let i=0; i