0

関数をhtml要素にバインドしています。

反復ごとに変化するループ内のデータがいくつかあります

data = {
    networkId: networkId,
    network_avatar: network_avatar,
    network_user_name: network_user_name,
}

ここで私はそれを拘束しています:

$("#element"+i).bind(function(){ 
    change(data);
}

関数は次のとおりです。

function change(data){
    console.log(data);
}

data反復ごとに変数に異なるデータが存在する必要があります。

ただし、常に最後の反復の内容が含まれています。
jQueryがすでにchange()関数にバインドされているデータを変更する理由

4

2 に答える 2

1

関数を別の関数内にネストして、クロージャを作成してみてください。クロージャの秘訣は、内部関数と外部関数の2つの入れ子関数が必要なことです。内部関数は、そのスコープを継承するという意味で、外部関数の変数とパラメーターのコピーを所有します。私の例では、bindClickが外部関数として機能し、$。click()の呼び出し内の無名関数が内部関数として機能します。これにより、bindClick()メソッドに渡されたデータオブジェクトをパラメーターとして保持する匿名の内部関数が生成されます。これをループで実行すると、基本的に、作成時に使用されたデータオブジェクトを記憶する10個のクロージャーが作成されます。

実例:http: //jsfiddle.net/cDwEk/1/

function bindClick(data){
  $("#element" + data.myProp).click(function(){
         //anonymous function will remember state of outer functions variables.
         alert(data.myProp);     
    });    
}

//ForLoop
for(var i = 0; i < 10; i++){
    var data = {myProp:i};
    //Pass function to another function to create closure.
    bindClick(data);
}
于 2012-11-06T09:56:30.887 に答える
1

まず、「data」や「window」などの名前のグローバル変数は使用しないでください。変数データの宣言がビジョン領域のどこかにある場合は、「var」ベアワードを使用します。

イベントハンドラーが呼び出されると、「変更」関数が呼び出され、その中のデータの現在の値が送信されます。必要なのは、ハンドラーごとに独自のデータを宣言することです。また、「var」を使用する必要があります。好き:

$("#element"+i).bind(function(){
   var currentDataValue = new CopyData(data);
   change(currentDataValue);
}

function CopyData(object) {
   var data = {};
   for (var val in object)
      data[val] = object[val];
   return data;
}

私はそれが役立つはずだと思います。しかし、私にはよくわかりません。

于 2012-11-06T10:01:17.370 に答える