Javascript 为什么这是未定义的?

Javascript 为什么这是未定义的?,javascript,Javascript,我试图在元素悬停时修改它,在某个时候,我需要获取所有类名为“image”的元素,我的问题是,虽然Allegements在主函数中有一个值(第一个警报显示该值),但从匿名函数调用Allegements时,它不再有值(未定义) 这里怎么了 function register() { var i = 0 var allElements = document.getElementsByClassName("image") alert(allElements) // Has a

我试图在元素悬停时修改它,在某个时候,我需要获取所有类名为“image”的元素,我的问题是,虽然Allegements在主函数中有一个值(第一个警报显示该值),但从匿名函数调用Allegements时,它不再有值(未定义)

这里怎么了

function register() {

    var i = 0
    var allElements = document.getElementsByClassName("image")
    alert(allElements) // Has a value
    while (i < allElements.length) {
        allElements[i].addEventListener("mouseover", function() {
            var description = null
            var j = 0
            alert(allElements[i]) // Undefined
            while (j < allElements[i].children.length) {
                var child = allElements[i].children[j]
                description = child
                if (child.id == "description") {
                    break
                }
                j++;
            }

            description.style = "display: block"

        });
        i++
    }

}
函数寄存器(){
变量i=0
var allegements=document.getElementsByClassName(“图像”)
警报(等位基因)//有一个值
而(i<等位基因长度){
等位基因[i]。addEventListener(“mouseover”,function()){
var description=null
var j=0
警报(等位基因[i])//未定义
while(j<等位基因[i].儿童.长度){
var child=等位基因[i]。children[j]
description=child
if(child.id==“description”){
打破
}
j++;
}
description.style=“显示:块”
});
我++
}
}

谢谢

在事件触发时,
i
等于
元素。长度
,因此
元素[i]
未定义-没有
元素[elements.length]
这样的元素

您会想在这里阅读:它更详细地解释了循环索引变量问题


对于您的特定问题,人们建议通过注释使用
this
,因为在事件处理程序中,
this
对象指的是被鼠标移过的元素,这允许您完全避免循环索引问题。

尝试在函数中传递事件,并通过事件访问元素

allElements[i].addEventListener("mouseover", function(e) {
  // code
  alert(e.target);
  // code
});

在事件侦听器的函数中,您引用的是
allegements[i]
,它不再是有效的引用。将其替换为
this
尝试将其引用为
alert(this)
而不是事件外部的变量listener@ChrisForrence你是说
this.allegements[i]
?要进一步说明为什么它是未定义的,当
while
循环结束时,
i
的值为
allegements.length
(因为它在循环的每个刻度上增加1,甚至在我们退出之前)。如果
等位基因中有7个元素,那么
i
将是7,而
等位基因[7]
不存在。这只是为了您的概念理解,请按照上面的建议进行实际修复。@Amleonard但是
这是指什么?