Javascript for循环的Int在函数-JS中不起作用

Javascript for循环的Int在函数-JS中不起作用,javascript,for-loop,Javascript,For Loop,我对Javascript非常陌生,并注意到出现了这个奇怪的问题 var dispatchMouseEvent = function(target, var_args) { var e = document.createEvent("MouseEvents"); e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1)); target.dispatchEvent(e);

我对Javascript非常陌生,并注意到出现了这个奇怪的问题

    var dispatchMouseEvent = function(target, var_args) {
        var e = document.createEvent("MouseEvents");
        e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
        target.dispatchEvent(e);
    };

    var Level1Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry "); //GETTING LEVEL 1 CATS

    var Level1CatsLen = Level1Cats.length; //GETTING LEVEL 1 CAT LEN

    for (i = 0; i <= Level1CatsLen-1; i++) {

        var ID1 = Level1Cats[i].id;
        var temp1 = Level1Cats[i].innerHTML;
        temp1.replace(/&amp;/gi, "&").replace(/<[^>]*>/gi, "");

        function GoToLevel2(callback) { //GO TO NEXT LEVEL!
        dispatchMouseEvent(Level1Cats[i], "mouseover", true, true);
        dispatchMouseEvent(Level1Cats[i], "click", true, true);
        }

        function GetLevel2() { //GET NEXT LEVEL
        var Level2Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry");
        return Level2Cats.length;
        }

        setTimeout(function() { //RUN IT WITH TIMING
            GoToLevel2();
        }, 100);
        var Level2CatsLen = GetLevel2();
}
var dispatchMouseEvent=函数(目标,变量参数){
var e=document.createEvent(“MouseEvents”);
e、 initEvent.apply(e,Array.prototype.slice.call(arguments,1));
目标。调度事件(e);
};
var Level1Cats=document.getElementsByClassName(“p-pstctgry-lnk-ctgry”)//得到一级猫
var Level1CatsLen=Level1Cats.length//获得1级CAT LEN
对于(i=0;i/gi,“”);
函数GoToLevel2(回调){//转到下一级!
DispatchMouseeEvent(1级猫[i],“鼠标上方”,真,真);
DispatchMouseeEvent(Level1Cats[i],“点击”,真,真);
}
函数GetLevel2(){//GET NEXT LEVEL
var Level2Cats=document.getElementsByClassName(“p-pstctgry-lnk-ctgry”);
返回水平2厘米长度;
}
setTimeout(函数(){//随时间运行它
GoToLevel2();
}, 100);
var Level2CatsLen=GetLevel2();
}
执行代码时,它会给我一个错误(无法读取未定义的属性“dispatchEvent”) 我知道这是因为函数中的I似乎不起作用。如果我简单地将其替换为int值1,它将执行并按预期单击cat 1 16次


我本以为这应该行得通,有什么办法可以解决吗?

在循环内部,当
I
1
时,会创建一个闭包
GoToLevel2
,关闭变量
I
。然后循环运行,
i
增加到
2
,循环终止

然后您的
setTimeout
在100ms后触发,并调用闭包。它仍然记得曾经有一个变量
i
,但现在它包含
2
Level1Cats[2]
未定义,您会得到一个错误

标准解决方案是将循环的内容封装到另一个不会关闭
i
的自评估函数中:

for (i = 0; i <= Level1CatsLen-1; i++) {
    (function(i) {
         // ...
    })(i);
}

for(i=0;i@Thilo爱你的工作:)