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

首先,不要使用名为“data”或“window”的全局变量或类似的任何东西。如果变量数据的声明位于视觉区域的某个位置,请使用“var”裸字。

当事件处理程序被调用时,它会调用“change”函数并在其中发送数据的当前值。您需要的是为每个处理程序声明自己的数据。你应该使用“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 回答
1

尝试将函数嵌套在另一个函数中以创建闭包。闭包的诀窍是你必须有两个嵌套函数,一个内部函数和一个外部函数。内部函数将拥有外部函数变量和参数的副本,在某种意义上继承其范围。在我的示例中,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 回答