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

Int from for loop not working in function - JS

本文关键字:不起作用 JS 函数 from for 循环 Int      更新时间:2023-09-26

我对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();
}

当代码被执行时,它给了我一个错误(无法读取未定义的属性"调度事件")我知道这是因为函数中的 i 似乎不起作用。如果我简单地用 int 值 1 替换它,它将执行并单击 cat 1,按预期单击 cat 1 16 次。

我本来认为这应该有效,有什么想法可以解决吗?

在循环中,创建一个闭包GoToLevel2,当i 1时,关闭变量i。然后循环通过,i递增到2,循环终止。

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

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

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

(另请注意,setTimeout(function() { GoToLevel2(); }, 200)setTimeout(GoToLevel2, 200) 相同,但效率较低。