我有一个循环数组的函数......虽然它工作似乎改变了从“开始”函数发送到“处理”函数的信息的值,但我不知道为什么......我我确定我犯了一个愚蠢的错误,但我看不出错误= /
这是我的功能:
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”的值?
答案 0 :(得分:4)
当实际调用onclick
函数时,i
的值会因为它所在的循环而发生变化。你应该“锚定”它的值。最简单的方法就是这样:
for( some loop on `i`) {
(function(i) {
// your code that depends on `i`
})(i);
}
这将确保i
的值不会在该闭包内发生变化(除非您自己更改)
答案 1 :(得分:2)
begin
函数window.onload = begin;
- 无需额外功能i
变量需要额外关闭。事件处理程序执行的时间,它将使用变量i
- 其当前值是它在上一个循环周期中获得的值。您的count
变量可能与此问题相同。for(var i=0; i<array_data.length; i++) (function(i){
<...>.onclick = function() { ...i...; };
})(i);
答案 2 :(得分:0)
在ECMAScript 5中,您可以继续使用bind
将参数绑定到您的函数:
document.getElementById('result' + count).onclick = process.bind(null, i);
如果您不必担心Internet Explorer 8及更早版本,那就太棒了。