考虑这个 JavaScript 小片段:
for(var i in map.maps)
{
buttons.push($("<button>").html(i).click(function() { alert(i); }));
}
它为 map.maps
对象(它是一个关联数组)中的每个字段创建一个按钮。我将索引设置为按钮的文本,并将其也设置为提醒索引。显然,人们会希望所有按钮在单击时都提示其自己的文本,但所有按钮在单击时都会提示 map.maps
对象中的 final 索引的文本。
我假设这种行为是由 JavaScript 处理闭包的巧妙方式引起的,返回并从创建它们的闭包执行函数。
我能想到的解决这个问题的唯一方法是将索引设置为按钮对象上的数据,并在点击回调中使用它。我还可以在我的 buttons
对象中模拟 map.maps
索引,并使用 indexOf
在点击时找到正确的索引,但我更喜欢前一种方法.
我在答案中寻找的是确认我正在以正确的方式做事,或者关于我应该如何做的建议。
最佳答案
拥抱闭包,不要绕开它们。
for(var i in map.maps)
{
(function(i){
buttons.push($("<button>").html(i).click(function() { alert(i); }));
})(i);
}
您需要包装使用您的 var i 的代码,以便它在一个单独的闭包中结束,并且该值保存在该闭包的本地 var/param 中。
像 lonesomeday 的回答中那样使用单独的函数稍微隐藏了这种闭包行为,但同时更加清晰。
关于javascript - 我如何解决 Javascript 闭包问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6249712/