关于javascript:for循环中的settimeout不起作用

settimeout in for loop is not working

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
setTimeout in a for-loop and pass i as value

我正在尝试生成动态数组并使用此数组作为循环..但在循环settime out不工作或功能不起作用。
这是我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
jQuery(document).ready(function () {
    temp = new Array();
    generateArray(temp);

    function generateArray(temp) {
        if (temp.length < 10) {
            res = randomXToY(1, 10, 0);
            for (var k = 0; k < temp.length; k++) {
                if (temp[k] == res) {
                    var test = 1;
                }
            }
            if (test != 1) {
                temp.push(res);
                //abc(temp);
            }
            generateArray(temp);
        } else {
            for (var z = 0; z < 10; z++) {
                tnest(temp[z]);
                setTimeout(function () {
                    removeClassImg(temp[z])
                }, 3000);
            }
            temp = new Array();
            generateArray(temp);
        }
    }

    function removeClassImg(result1) {
        alert(result1);
        $('#img' + result1).fadeTo(12000, 0.1);
        return true;
    }

    function tnest(result) {
        alert(result);
        $('#img' + result).fadeTo(12000, 1);
        return true;
    }

    function randomXToY(minVal, maxVal, floatVal) {
        var randVal = minVal + (Math.random() * (maxVal - minVal));
        return typeof floatVal == 'undefined' ? Math.round(randVal) : randVal.toFixed(floatVal);
    }
});

函数removeClassImg中的警报不起作用..我在for循环中使用settimeout这不能正常工作。


它与超时和循环有关。 你需要将它包装在一个闭包中,以便你的超时回调绑定到当时的z"的值"。

循环后我也注意到了这一点:

1
2
temp = new Array();
generateArray(temp);

当您想要操作延迟操作时,您的阵列不再包含您需要的值。 你已经清除了它们。

试试这个:

1
2
3
4
5
6
7
8
for (var z = 0; z < 10; z++) {
    (function (tz) {                  //"localize" temp[z] by creating a scope
        tnest(tz);                    //that makes temp[z] local. this is done
        setTimeout(function () {      //by creating an immediate function
            removeClassImg(tz)        //passing temp[z] into it. that way, the
        }, 3000);                     //timeout receives a local temp[z] which
    }(temp[z]));                      //has the value of temp[z]"at that time"
}

这是一个带闭合的样本和没有它的样本。 3秒后,您将看到没有它的那个将记录所有10个而不是0-10个。


那是因为您正在访问setTimeout中设置的函数中的变量z,创建一个闭包,并在循环中使用z。 这意味着,当setTimeout调用该函数时,您可能最终会将z等于10

我已经在这里讨论过这个问题和可能的解决方案:如何将变量传递给setTimeout函数? 我认为它会对你有所帮助!