2011-06-25 7 views
0

可能性の重複:
How do JavaScript closures work?なぜ結果はすべて5ですか?

<script type="text/javascript"> 
function init() {  
    var pArry = document.getElementsByTagName("p");  
    for(var i=0; i<pAry.length; i++) {  
     pArry[i].onclick = function() {  
     alert(i);  
    } 
    } 
} 
</script> 
</head> 
<body onload="init();"> 
<p>test 0</p> 
<p>test 1</p> 
<p>test2</p> 
<p>test3</p> 
<p>test4</p> 

なぜ結果がすべて5ですか?私は嘘つきが(0,1,2 ....)したいです。

答えて

1

iを参照していますが、その機能を作成するときの値はiではありません。 iの値を凍結するためにこれを試してみてください:

function init() {  
    var pArray = document.getElementsByTagName("p");  
    for(var i=0; i<pAry.length; i++) {  
     (function(i) { 
      pArray[i].onclick = function() {  
       alert(i);  
      }; 
     })(i); 
    } 
} 
+1

これはまさにi' 'の値を凍結しない - むしろ、これは、それぞれの閉鎖のために(新しい関数スコープ経由)*新しい*' i'を作成します外部の無名関数が適用されたときの(ループからの)現在の「i」の初期値を有する。私は 'i'を再使用しないと、意図をより明確にするかもしれないと思います。 –