2011-01-19 34 views
1

我的代码看起来像这样:重新定义一个局部变量在javascript关闭

for(var i=0; i<10; i++) { 
    var someClickableObject = new Object(); 
    someClickableObject.index = i; 

    eventListenerFunction(someClickableObject, 'click', function() { 
     alert(someClickableObject.index); 
    }); 
} 

所以我创建了一堆可点击的对象,给每个等于循环索引的属性,上设置点击事件提醒其索引属性的对象。

我希望每个对象都能提醒创建它的索引i。相反全部对象警报9.我认为这是因为事件侦听器在每次迭代中重新定义的对象上形成一个闭包。

关于如何解决这个问题的任何想法?

回答

1

问题实际上与您所写的相反:全部功能共享相同关闭。 (编辑 —重新阅读你写的内容后,我不确定它是否与任何东西“相反”;关键是你传递给“eventListenerFunction”的所有这些小函数将共享相同的变量“someClickableObject” ,所以在循环结束时,他们都会指在最后一次迭代创建的)

要解决它,你需要引入某种方式的另一个范围:

eventListenerFunction(someClickableObject, 'click', (function(obj) { 
    return function() { 
    alert(obj.index); 
    }; 
})(someClickableObject)); 

,介绍一个匿名功能。通过引用局部变量来调用这个小函数,该函数的作用是创建另一个范围。该函数返回实际传递给该“eventListener”事物的函数。它现在有自己的“someClickableObject”副本。

然而,它只是一个副本。在你的情况下,这没关系,因为你在每次迭代中创建一个新对象。在实践中,我几乎从不担心这种情况;通常我只需要担心一个浅拷贝(因为它通常只是一个计数器,或者一个字符串键值,或者类似的东西)。

+0

你的好。谢谢。 – opl 2011-01-19 16:11:26