我将函数绑定到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()
函数
答案 0 :(得分: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);
}
答案 1 :(得分:1)
首先,不要使用名为“data”或“window”的全局变量或其他类似的东西。如果您的可变数据声明在视觉区域的某处,请使用“var”bareword。
当调用事件处理程序时,它调用“更改”函数并在其中发送当前数据值。你需要的是为每个处理程序声明自己的数据。你应该使用“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;
}
我想它应该有所帮助。但我不太确定。