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を使用しないでください(OK、ここでは適用されません)
  • 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 に答える