Javascript 循环结果数组的最后一个索引

Javascript 循环结果数组的最后一个索引,javascript,dom-events,addeventlistener,Javascript,Dom Events,Addeventlistener,我有以下代码,可以使用addeventlistener将每个元素添加到事件中: var x, y, z; elm = elm.normalize(); if(!isobj(elm) && iselm(elm)) { elm = new Array(elm); } for(x in elm) { (function() { elm[x].addEventListener('click', function() { aler

我有以下代码,可以使用
addeventlistener
将每个元素添加到事件中:

var x, y, z;

elm = elm.normalize();
if(!isobj(elm) && iselm(elm)) {
    elm = new Array(elm);
}

for(x in elm) {
    (function() {
        elm[x].addEventListener('click', function() {
            alert(x);
        });
    })();
}
但是,当我单击任何通过循环添加事件的
元素时,它总是显示最后一个索引
示例
,就像我单击
元素
时,它在警报框中显示带有
示例
文本的警报一样

下面是
elm=elm.normalize()之后的
console.log(elm)
的结果:

[sample:input.sample.fld,example:input.example.fld]

isobj(elm)
是一个
函数
,用于检查
变量
是否是
对象
,与
相同
iselm(elm)
是一个
函数
,用于检查
变量
是否是
元素

为了解决这个问题,我尝试使用,
(function(){/*我把addEventListener放在上面的*/})()在循环中,但仍然不起作用

我已经确定
x
总是显示它的索引,但我不知道为什么它总是显示事件中的最后一个索引


请提供帮助。

执行代码行时,for循环已经完成

解释如下:

如果浏览器支持,您可以使用
let
。(有关解释和备选方案,请参见文章)


您已经应用了解决此问题的其中一种模式的一半,但只应用了其中的一半。有关详细信息,请参见链接问题的答案,但您需要将
x
传递到循环中的匿名函数:
}(x)而不仅仅是
}()
(为了清晰起见,我使用了一个不同的名称,但很多人不这么认为):
for in
不是循环数组的方式;查看原因和使用方法(在本例中,
forEach
将特别方便,因为它的回调将是匿名函数)。非常感谢,这对我来说是一个新知识。它不起作用,最后一个索引仍然显示在事件
let myX=x
应该在
(function(){/*code*/})中谢谢您的建议。不要将
myX
声明为传递给
addEventListener
的函数的参数。这将覆盖函数上下文中的闭包。@RyanSearle更新了我的answer@RyanSearle我不能接受,因为答案是快接受,但我已经接受了。
var x, y, z;

elm = elm.normalize();
if(!isobj(elm) && iselm(elm)) {
    elm = new Array(elm);
}

for(x in elm) {
    (function() {
        let myX = x;
        elm[myX].addEventListener('click', function() {
            alert(myX);
        });
    })();

}