8

可能重复:
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)
             }
         });
        }               
    }
 }

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

4

3 回答 3

8

您传递给的函数在提交事件触发时.live()执行。到那时,就会有它们的最终值。您需要在事件处理程序之外创建闭包:ij

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

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

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


旁注

.live()并且.die()已经被弃用了很长时间。使用.on()(使用 jQuery 1.7+)或.delegate()(使用旧版本)。

于 2013-01-16T21:54:18.253 回答
0

您的代码设置groups.length平方实时提交处理程序。每个实时处理程序都包含此函数的不同副本:

function{
    function (groups2, i2, j2){
        return function(){alert(groups2[i2][j2])}
    }(groups, i, j)
}

当提交事件发生时,所有实时处理程序文件,每个都引用and的最后一个值。ij

根据代码片段很难说出你真正想要的东西,如果有更多信息,我可能会提供更多帮助。祝你好运!

于 2013-01-16T21:55:58.177 回答
-1

试试这个

for (var i in groups){
    for(var j in groups[i]){
        $(unique_form).die('submit').live('submit', function( groups2, i2, j2 ){
             return function (){
                 alert(groups2[i2][j2])
             }
         }(groups, i, j) );
        }               
    }
 }
于 2013-01-16T21:54:41.747 回答