我如何解决Javascript闭包问题?

Hub*_*bro 6 javascript jquery closures function

考虑这个小小的JavaScript片段:

for(var i in map.maps)
{
    buttons.push($("<button>").html(i).click(function() { alert(i); }));
}
Run Code Online (Sandbox Code Playgroud)

它为map.maps对象中的每个字段创建一个按钮(它是一个assoc数组).我将索引设置为按钮的文本,并将其设置为警告索引.显然,人们会希望所有按钮在单击时提醒它自己的文本,而是所有按钮在单击时提醒对象中最终索引的文本map.maps.

我认为这种行为是由JavaScript处理闭包,返回并从创建它们的闭包中执行函数的巧妙方式引起的.

我可以想象解决这个问题的唯一方法是将索引设置为按钮对象上的数据并使用单击回调中的数据.我也可以模仿map.maps我的buttons对象中的索引,并在点击使用时找到正确的索引indexOf,但我更喜欢前一种方法.

我在答案中寻找的是确认我正在以正确的方式做,或者建议我该如何做.

Mar*_*ger 9

拥抱封闭,不要在它们周围工作.

for(var i in map.maps)
{
    (function(i){
        buttons.push($("<button>").html(i).click(function() { alert(i); }));
    })(i);
}
Run Code Online (Sandbox Code Playgroud)

您需要包装使用var i的代码,以便它最终在一个单独的闭包中,并将值保存在该闭包的本地var/param中.

使用像lonesomeday一样的单独函数的答案会隐藏这种闭包行为,但同时也更加清晰.