js for循環出力iは同じ値の問題です.

1879 ワード

1、最近開発中に問題があったのですが、どうして毎回出力は5で、各pをクリックするのではなく、alertに対応する1、2、3、4、5をクリックします.
コードは以下の通りです
     
     
     
       
     
     

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