相同的JS闭包循环问题 - 但是SO的答案不起作用

Geo*_*e B 8 javascript jquery closures

可能重复:
JavaScript闭包如何工作?

我已经阅读了相同的旧javascript闭包循环问题的所有百万重复.我以为我理解它们,并且直到今天一直使用闭包几个月而没有问题.我很难过.

for (var i in groups){
    for(var j in groups[i]){
        $(unique_form).die('submit').live('submit'), function{
             function (groups2, i2, j2){
                 return function(){alert(groups2[i2][j2])}
              }(groups, i, j)
             }
         });
        }               
    }
 }
Run Code Online (Sandbox Code Playgroud)

当我提交每个独特的表单时 - 我不断收到组[i] [j]的最后一个元素的警报.显然,我做了一些蠢事,这是什么?我认为通过创建匿名函数groups2,i2和j2,我正在解决这个问题.

Jam*_*ice 8

传递的函数在触发submit事件时.live()执行.到了那个时候,和将其最终值.您需要在事件处理程序之外创建闭包:ij

(function (i2, j2) {
    $(unique_form).die('submit').live('submit', function{
        alert(groups[i2][j2])
    });
}(i, j));
Run Code Online (Sandbox Code Playgroud)

请注意,我已从groups匿名函数中删除了参数.没有必要关闭它,因为它的价值不会改变.我还将整个函数表达式包装在括号中,这是约定(在这种情况下实际上是必需的,强制它被解析为表达式).

另请注意,我已经删除了.live()问题中第一个参数后的右括号.它应该不存在.


旁注.

.live()并且.die()已经被弃用多年了.使用.on()(使用jQuery 1.7+)或.delegate()(使用旧版本).