2015-05-10 235 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 –