2015-05-10 169 views
1

我想解决testdome上作为公共问题发布的这个问题。每个as[i]应该是alert(i)的函数。 是错误修正的代码是这样的:循环中的JavaScript关闭

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

如果它使用'.forEach()'而不是简单的'for'循环进行迭代,它就可以正常工作。 – Pointy

回答

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; 
     } 
    } 
} 
+0

谢谢,它的工作原理。我们有必要在循环之外编写函数吗?我们仍然做一些最小的修改,以便在循环内部定义函数? – DurgaDatta

+0

NP。有很多原因不会使循环中的功能 - 它绝对是一个很好的做法,并没有任何缺点。它通常会增加可读性,正如您可以从上面的示例中看到的那样。 [这里](https://jslinterrors.com/dont-make-functions-within-a-loop)是一篇很好的文章,其中有一些推理。 –

+0

嘿家伙...我知道它几年后..但由于亚历克斯评论中的链接不工作,我建议看到这个家伙视频显示为什么不使用循环中的功能 - https://www.youtube .COM /手表?ν= Nqfs14iu_us –