Javascript - 避免(闭包的影响)

时间:2012-07-24 21:44:22

标签: javascript closures

  

可能重复:
  Javascript: closure of loop?

我有一些关于javascript闭包的问题,​​我无法解决这个问题......我通常发现它们非常有用,但这次它们正在阻碍我。

我的问题

我有一个包含一些信息的对象列表 - 我们称之为infosinfos中的每个对象都有一个字符串属性text,以及一个引用控件对象的属性control。控制对象(除其他外)具有函数属性activateinfos中对象的示例可能如下所示:

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

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

有没有办法实现这个目标?或者,或许,更好的解决这个问题的方法?

0 个答案:

没有答案
相关问题