Javascript 循环中的addEventHandler()具有意外结果

Javascript 循环中的addEventHandler()具有意外结果,javascript,javascript-events,Javascript,Javascript Events,我不知道该找什么,所以我找不到以前关于这个话题的任何问题,谷歌也帮不了什么忙 (function() { var element = function(str) { return document.getElementById(str); }, parent = document.getElementsByTagName('ul')[0].getElementsByTagName('li'), len = parent.l

我不知道该找什么,所以我找不到以前关于这个话题的任何问题,谷歌也帮不了什么忙

(function() {
    var element = function(str) {
        return document.getElementById(str);
        },

        parent = document.getElementsByTagName('ul')[0].getElementsByTagName('li'),
        len = parent.length,

        slides = slides || [];

    for (var i=0; i<len; i++) {
        var link = parent[i].getElementsByTagName('a')[0],
            slide = element(parent[i].getElementsByTagName('a')[0].getAttribute('href').substr(1));


        if (addEventListener) {
            link.addEventListener('click', function(event){
                event.preventDefault();
                alert(slide.getAttribute('id'));
            });
        } else if (attachEvent) {

        }
    }

})();
(函数(){
变量元素=函数(str){
返回文档.getElementById(str);
},
parent=document.getElementsByTagName('ul')[0]。getElementsByTagName('li'),
len=父项长度,
幻灯片=幻灯片| |[];

javascript中的for(var i=0;i变量是函数范围,即使在块内声明它们也是如此。此循环围绕变量循环创建一个闭包,但每次迭代都会重新分配循环。循环完成时,所有闭包都指向数组中的最后一个元素

要解决此问题,请以不同方式确定变量的范围:

(function() {
    var element = function(str) {
        return document.getElementById(str);
        },

        parent = document.getElementsByTagName('ul')[0].getElementsByTagName('li'),
        len = parent.length;

    for (var i=0; i<len; i++) {
        var link = parent[i].getElementsByTagName('a')[0],
            slide = element(parent[i].getElementsByTagName('a')[0].getAttribute('href').substr(1));


        if (addEventListener) {
            link.addEventListener('click', (function(slide){
                return function(event) {
                    event.preventDefault();
                    alert(slide.getAttribute('id'))
                }
            })(slide));
        } else if (attachEvent) {

        }
    }

})();
(函数(){
变量元素=函数(str){
返回文档.getElementById(str);
},
parent=document.getElementsByTagName('ul')[0]。getElementsByTagName('li'),
len=父项长度;

对于(var i=0;i我以前遇到过这个错误,它与
幻灯片的绑定有关,这很难解释。下面是一个修复方法

link.addEventListener('click',
    (function(x) {
       return function(event){
                event.preventDefault();
                alert(x.getAttribute('id'));
              }
     })(slide));

呃,幻灯片[]是我之前试图解决同一问题时留下的,您可以忽略它。我认为您的代码中有一个错误,但感谢您的回复。文本部分帮助很大!可能是…我没有仔细看,我编辑了它,但显然在它通过之前必须有人检查它。