0

可能重复:
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 闭包,这是因为当点击处理函数(在第二个代码片段中)是使用闭包创建时,该闭包具有指向在定义此函数时定义的变量的指针 -infosi第一个示例中,除了ctrl在第二。

如果我能够“避免关闭” ,我想我可以解决这个问题;换句话说,我想引用变量及其值,因为它们在声明单击处理函数时,而不是在其执行时。

有什么办法可以做到这一点?或者,也许,对这个问题有更好的解决方案?

4

0 回答 0