代码之家  ›  专栏  ›  技术社区  ›  Sagar

与“for”循环具有相同值的输入元素

  •  2
  • Sagar  · 技术社区  · 2 年前

    我刚刚尝试了JavaScript,并尝试了这段代码。

    var elements = document.getElementsByTagName("p");
    var n = elements.length; // Should be: 10
    
    for (var i = 0; i < n; i++) {
      elements[i].onclick = function () {
        console.log("This is element #" + i);
      };
    }
    <p>Element: #1</p>
    <p>Element: #2</p>
    <p>Element: #3</p>
    <p>Element: #4</p>
    <p>Element: #5</p>

    然而,当代码运行时,一些奇怪的事情发生了。基本上,例如,如果你点击元素#1,它会说你点击了元素#5。


    这就是我想知道的:

    1. 为什么会这样?
    2. 有解决办法吗?
    2 回复  |  直到 2 年前
        1
  •  1
  •   Arnav Thorat natanavra    2 年前

    您可以使用下面的代码来纠正这些问题。

    var elements = document.getElementsByTagName("p");
    var n = elements.length;
    
    function makeHandler(num) {
         return function() {
             console.log("This is element #" + num);
         };
    };
    
    for (var i = 0; i < n; i++) {
        elements[i].onclick = makeHandler(i + 1);
    }
    

    让我们解释一下代码。


    基本上,在这个代码中, makeHandler 每次我们通过循环,每次接收到 i + 1 并将其绑定到一个作用域 num 变量

    外部功能( makeHandler )返回内部函数(匿名函数)(也使用此作用域 号码 变量)和元素 onclick 设置为该内部功能。

    这确保了每个 onclick 接收并使用适当的 i 值(按作用域) 号码 变量)。

        2
  •  1
  •   Oleg    2 年前

    将var更改为允许:

    for (let i = 0; i < n; i++) {
      elements[i].onclick = function () {
        console.log("This is element #" + i);
      };
    }