javascript - 为什么无论我点击哪一段,都会得到相同的输出?

标签 javascript html

我想使用 for 循环在段落上分配一个函数。我希望当我单击段落时控制台显示“0”和“1”,但实际输出是“2”。

这是我的代码:

var para = document.getElementsByName('mypara');
for (var i = 0; i < para.length; i++) {
  console.log(i); //this is expected result i.e "0" and "1"
  para[i].addEventListener('click', function() {
    console.log(i) //here it is printing "2" no matter on which para i click
  });
}
<p name="mypara">1</p>
<p name="mypara">2</p>

最佳答案

更改为 let 而不是 var (要走的路)

<script>
      var para = document.getElementsByName('mypara');
      for (let i = 0; i < para.length; i++) {
        console.log(i); //this is expected result i.e "0" and "1"
        para[i].addEventListener('click', function() {
          console.log(i) 
        });
      }

</script>

或者,如果你想保留 var,请创建一个闭包(避免它)

<script>
  var para = document.getElementsByName('mypara');
  for (var i = 0; i < para.length; i++) {
    ((i) => {
      console.log(i); //this is expected result i.e "0" and "1"
      para[i].addEventListener('click', function() {
        console.log(i) 
      });

    })(i)
  }

</script>

说明:

这是因为,在调用 click 方法时,for 循环已经完成,并且变量 i 的值已经为 2,

为了使其工作,您需要在 for 循环的每次迭代中捕获 i 的值,将其传递到新创建的函数对象(闭包)中。

参见:执行上下文、变量对象、激活对象、内部作用域闭包和循环...

正如答案下面的评论指出的那样,永远不要使用 var,依赖 const 和 let

关于javascript - 为什么无论我点击哪一段,都会得到相同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57749266/

相关文章:

html - 在不增加宽度或列的情况下旋转表头内的图像

javascript - cefsharp 从 C# 执行 Javascript

javascript - R:从网站下载 .csv

javascript - document.addEventListener 不适用于加载的 svg

javascript - 加载 gridstore 时出现“无数据可显示”消息 Ext JS

html - 悬停溢出的文本在 <a> 内不对齐

javascript - 如何使用 glyphicon 上传图像而不是使用那个长输入字段?

javascript - 根据导入的值 [javascript, jquery] 在表的下拉列表中设置一个值

javascript - 带有对象变换的数组

javascript - 更改最大值后输入范围拇指不刷新