来自for循环的int不能在函数中工作 - JS

时间:2014-11-17 06:48:26

标签: 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);
    };

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

当代码执行时,它会给我一个错误(无法读取未定义的属性'dispatchEvent') 我知道这是因为函数中的i似乎不起作用。如果我只是用int值1替换它,它将执行并按预期点击cat 1,16次。

我本以为这应该有用,有什么想法我可以解决它吗?

1 个答案:

答案 0 :(得分:0)

在循环内部,当GoToLevel2i时,会创建一个闭包i,关闭变量1。然后循环遍历,i递增到2,循环终止。

然后你的setTimeout在100ms后开火,并调用你的关闭。它仍然记得有一个变量i,但它现在包含2Level1Cats[2]未定义,您收到错误。

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

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

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