循环中的JavaScript闭包

时间:2015-05-10 14:57:32

标签: javascript closures

我想在testdome上解决这个公开提问的问题。每个as[i]应该是alert(i)的函数。 要修复错误的代码是:

function registerHandlers() {
  var as = document.getElementsByTagName('a');
  for (i = as.length; i-- >= 0;) {
    as[i].onclick = function() {
      alert(i);
      return false;
    }
  }
}

我尝试的解决方案是:

function registerHandlers() {
  var as = document.getElementsByTagName('a');
  //made the loop variables more explicit
  for (i = as.length-1; i >=0; i--) {
    var x = i;
    as[x].onclick = function() {
      alert(x);
      return false;
    }
  }
}

我虽然变量i是持久的,但我将其副本保留在变量x中,并使用变量x而不是i。但它并没有完全解决问题。请让我知道我的误解是什么。

1 个答案:

答案 0 :(得分:5)

您的ix值在完全相同的范围内声明,因此在执行函数时x将是其最终值。您可以创建一个这样的闭包:

function registerHandlers() {
    var links = document.getElementsByTagName('a');

    for (var i = 0, len = links.length; i < len; i += 1) {
        links[i].onclick = generateHandler(i);
    }

    function generateHandler (index) {
        return function () {
            alert(index);
            return false;
        }
    }
}