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这不能正常工作。
它与超时和循环有关。 你需要将它包装在一个闭包中,以便你的超时回调绑定到当时的
循环后我也注意到了这一点:
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函数? 我认为它会对你有所帮助!