0

我有一个循环数组的函数......虽然它工作它似乎改变了从“开始”函数发送到“处理”函数的信息的值,但我不知道为什么......我确定我犯了一个愚蠢的错误,但我看不到错误=/

这是我的功能:

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

所以我想知道为什么当它到达进程函数时它会改变“i”的值?

4

3 回答 3

4

onclick函数实际被调用时,它的值i将会因为它所在的循环而改变。你应该“锚定”它的值。最简单的方法是这样的:

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

这将确保该i闭包内的值不会改变(除非你自己改变它)

于 2012-07-25T23:19:42.213 回答
2
  • 不要在数组上使用 for-in-loops(好的,这里不适用)
  • begin您的函数缺少右括号
  • 只需使用window.onload = begin;- 无需额外功能
  • i然而,您的变量需要额外的闭包。事件处理程序执行的时间,它将使用变量i- 其当前值是它在最后一个循环周期中获得的值。你的count变量可能是同样的问题。
for(var i=0; i<array_data.length; i++) (function(i){

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

})(i);
于 2012-07-25T23:25:11.143 回答
0

在 ECMAScript 5 中,您可以继续使用bind将参数绑定到您的函数:

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

如果您不必担心 Internet Explorer 8 和更早版本,那就太好了。

于 2012-07-26T04:16:47.313 回答