2011-06-25 69 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?我想reault是(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'可能會使意圖更清楚。 – 2011-06-25 07:25:11