Javascript功能问题

时间:2010-05-21 07:41:59

标签: javascript loops closures

我搜索但找不到这个看似简单的问题的答案,所以......

假设我有一个循环,我需要设置回调。我的回调函数如下所示:

function callback(var1) { // code }

现在我的循环是这样的:

for( //condition)
{
  var x = something_different_each_time;
  document.getElementById('foo').addEventListener('click', function() { callback(x); }, false);
}

现在看起来即使循环运行n次,匿名函数也只编译一次 - 因此每次调用回调都会使用相同的参数调用(即使每次循环中x都有变化)。

我必须在这里遗漏一些东西..非常感谢任何帮助! :)

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

问题是for语句的块不会创建新范围,因此,x变量属于其封闭范围,并且所有匿名函数都引用相同的变量...

使用另一个函数创建一个新的词法环境,以便在每次迭代时保持x的值:

for(/*condition*/) {
  var x = something_different_each_time;
  document.getElementById('foo').addEventListener('click', function () {
    return function(y) {
      callback(y);
    };
  }(x), false);
}

答案 2 :(得分:1)

你应该在调用回调函数之前计算x!

for( //condition)
{
  //var x = something_different_each_time;
  document.getElementById('foo').addEventListener('click', function() { 
   var x = something_different_each_time;
   callback(x); }, false);
}

答案 3 :(得分:0)

是的,x将引用封闭范围中的相同变量,并且由于该函数稍后执行,因此它的最后一个值为x。试试这个:

.addEventListener(
    'click',
    (function (i) {
        return function () { callback(i); }
    })(x),
    false
);

这会创建一个闭包,当前值x锁定在其中。