可能重复:
Javascript:循环关闭?
我遇到了一些无法解决的 javascript 闭包问题......我通常发现它们非常有用,但这次它们妨碍了我。
我的问题
我有一个包含一些信息的对象列表——我们称之为infos
。中的每个对象infos
都有一个字符串属性text
和一个control
引用控件对象的属性。控制对象具有(除其他外)一个函数属性activate
。中的对象示例infos
可能如下所示:
var info = {
text: 'Some string',
control: {
activate: function() {
alert('activated!');
}
}
}
现在,我想根据infos
对象中的信息循环并创建一些新对象(实际上是一个 DOM 元素,使用 jQuery)info
。
我试过这样的事情:
for (var i in infos) {
$('<a>')
.attr('href', '#')
.text(infos[i].text)
.click(function() {
infos[i].control.activate(); // This is where I get problems
});
}
现在,当执行点击处理程序时,某些东西(在上面的示例中通常是变量i
)是undefined
,这会导致异常。
我还尝试了以下变体:
for (var i in infos) {
var ctrl = infos[i].control;
$('<a>')
.attr('href', '#')
.text(infos[i].text)
.click(function() {
ctrl.activate(); // This is where I get problems
});
}
在这种情况下,我没有得到任何异常,但无论我单击哪个项目,它始终是最后一个被激活的控件。
到目前为止,我对此的理解
如果我正确理解了 javascript 闭包,这是因为当点击处理函数(在第二个代码片段中)是使用闭包创建时,该闭包具有指向在定义此函数时定义的变量的指针 -infos
在i
第一个示例中,除了ctrl
在第二。
如果我能够“避免关闭” ,我想我可以解决这个问题;换句话说,我想引用变量及其值,因为它们在声明单击处理函数时,而不是在其执行时。
有什么办法可以做到这一点?或者,也许,对这个问题有更好的解决方案?