我有一些关于javascript闭包的问题,我无法解决这个问题......我通常发现它们非常有用,但这次它们正在阻碍我。
我有一个包含一些信息的对象列表 - 我们称之为infos
。 infos
中的每个对象都有一个字符串属性text
,以及一个引用控件对象的属性control
。控制对象(除其他外)具有函数属性activate
。 infos
中对象的示例可能如下所示:
var info = {
text: 'Some string',
control: {
activate: function() {
alert('activated!');
}
}
}
现在,我想循环遍历infos
并根据info
对象中的信息创建一些新对象(实际上是一个使用jQuery的DOM元素)。
我尝试过这样的事情:
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闭包,这是因为当使用闭包创建单击处理函数(在第二个代码片段中)时,该闭包具有指向定义此函数时定义的变量的指针 - {{1第一个示例中的{}和infos
,以及第二个中的i
。
如果我能“避免关闭”,我想我能够解决这个问题。换句话说,我想引用变量及其值,因为它们是声明点击处理函数,而不是执行
有没有办法实现这个目标?或者,或许,更好的解决这个问题的方法?