You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS:for循环中为addEventListener传索引时出现未定义错误怎么办?

解决JavaScript循环中绑定事件的索引传递问题

这个问题我太熟悉了!核心原因是你用var声明的变量i是函数级作用域,当mouseover事件触发的时候,循环早就跑完了,此时i的值已经变成了todos.length,自然就超出了trashShow数组的索引范围,所以才会报Cannot read property 'style' of undefined的错误。

下面给你几种简单有效的解决方案:

方案1:用let替换var(最推荐的ES6+写法)

let是块级作用域变量,每次循环都会创建一个新的i绑定到当前迭代的数值,事件处理函数会捕获到当前循环的那个i值,而不是最后循环结束的i。修改后的代码如下:

for (let i = 0; i < todos.length; i++) { 
  console.log("XD"); 
  todos[i].addEventListener("mouseover", function() { 
    trashShow[i].style.display = "inline"; 
  }); 
}

方案2:利用闭包保存当前索引

如果你的环境还不能用ES6,就用立即执行函数表达式(IIFE)创建一个独立的作用域,把当前循环的i作为参数传递进去,这样事件处理函数就能拿到正确的索引了:

for (var i = 0; i < todos.length; i++) { 
  console.log("XD"); 
  (function(index) {
    todos[index].addEventListener("mouseover", function() { 
      trashShow[index].style.display = "inline"; 
    });
  })(i);
}

方案3:使用数组的forEach方法

forEach的回调函数会自动接收当前元素和索引,每个回调函数的作用域都是独立的,也能避免这个问题:

todos.forEach(function(todo, index) {
  console.log("XD");
  todo.addEventListener("mouseover", function() {
    trashShow[index].style.display = "inline";
  });
});

这三种方法都能解决你的问题,优先推荐方案1,代码最简洁易懂~

内容的提问来源于stack exchange,提问作者Trebuh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:21:04