javascript - 我如何解决 Javascript 闭包问题?

标签 javascript jquery function closures

考虑这个 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/

相关文章:

jquery - 自动延时CSS横幅

php - 防止多次执行 JavaScript 函数

javascript - 关于并排对齐两个 span 只有一个文本溢出

javascript - window.opener 不适用于 chrome 和 Opera

javascript - jQuery 和 Ajax 加载图像

javascript - 如何在此脚本中添加多个 ID [需要语法]

c++ - 使用 C++ 字符串类函数从更长的原始基因组字符串中显示 “gene substrings”

Javascript - 更改 Google Chart onClick

c++ - 如何使用 std::allocator_traits::construct 从函数参数创建结构对象?

javascript - 登录/注销后强制所有页面访问刷新/清除缓存