2012-07-25 24 views
0

我有一個循環數組的函數...雖然它的工作似乎改變了從「開始」函數發送到「處理」函數的信息的值,但我不知道「知道爲什麼......我敢肯定,我犯了一個愚蠢的錯誤,但我看不到錯誤=/JS數組傳遞值無理變化

這是我的函數:

var array_data = data[9]; //global array to use 
console.log(array_data); //debug 

function process(i){ 
alert('Number is '+i); // shows the value "7" (should show value "1") 
} 

function begin(){ 
var count = 0; 

for(i in array_data){ 

if(parseInt(array_data[i][9])){ //if true 

    var result = create_layout(i); //function to make the layout 
    alert('Number is '+i); //shows the value "1" (this is correct so far) 

    document.getElementById('result'+count).innerHTML = result; 
    document.getElementById('result'+count).onclick = function() { process(i); };  

count++; 

     } 
} 

window.onload = function() { 
begin(); 
}; 

下面是我對陣列(array_data)從控制檯日誌:

1: Array[10] 
    0: "Car One" 
    1: "1" 
    2: "3" 
    3: "d2.jpg" 
    4: "1" 
    5: "1" 
    6: "200" 
    7: "85" 
    8: "5000" 
    9: "1" 
length: 10  

7: Array[10] 
    0: "Car Two" 
    1: "1" 
    2: "1" 
    3: "e2.jpg" 
    4: "1" 
    5: "0" 
    6: "500" 
    7: "50" 
    8: "3000" 
    9: "0" 
length: 10 

所以我想知道爲什麼當它達到過程函數時它會改變「我」的價值?

回答

4

onclick函數實際被調用時,i的值將因爲它所在的循環而發生變化。您應該「錨定」它的值。做到這一點最簡單的方法是這樣的:

for(some loop on `i`) { 
    (function(i) { 
     // your code that depends on `i` 
    })(i); 
} 

這將確保i值將不是封閉內改變(除非你自己去改變它)

+0

爲什麼它會改變這個div,雖然肯定有一次它的循環並將它分配給div ID result0下一個循環會將它分配給div ID result1? – Sir 2012-07-25 23:21:01

+1

是的,但'i'的實際值發生了變化。函數不是常量,它們是閉包,它們繼承了它們包含的範圍的變量。如果這些變量在該範圍內發生變化,該函數將反映該變化。 – 2012-07-25 23:22:25

+0

因此,將div id =「result0」設置爲值爲「1」的i在瀏覽器中並不是一成不變的,而是變量i。 – Sir 2012-07-25 23:25:14

2
  • 不要使用for-in-loops on arrays(OK,在這裏不適用)
  • 有缺少一個右括號您begin功能
  • 只需使用window.onload = begin; - 無需額外的功能
  • 然而,您的i變量需要額外的關閉。事件處理程序執行的時間,它將使用變量i - 其當前值是它在上一個循環中獲得的值。這可能與您的count變量存在相同的問題。
for(var i=0; i<array_data.length; i++) (function(i){ 

    <...>.onclick = function() { ...i...; };  

})(i); 
+0

我可以問爲什麼不建議使用for循環,因爲我需要將I分配給密鑰ID而不是位置。 – Sir 2012-07-25 23:26:19

+0

恩,是'array_data'沒有數組? – Bergi 2012-07-25 23:31:20

+0

這是一個從json_encode數組我攜帶與數組中的數據相關的ID作爲關鍵數字而不是0 1 2 3等等,如果這是有道理的?但它仍然只有一個array.length爲2 這就是爲什麼在console.log中顯示1和7,這些都是MYSQL表中的行ID! – Sir 2012-07-25 23:33:52

0

在ECMAScript中5,你可以繼續使用bind的參數綁定到你的函數:

document.getElementById('result' + count).onclick = process.bind(null, i); 

這是巨大的,如果你不擔心互聯網Explorer 8和更早版本。