我正在尝试生成动态数组并将此数组用作循环..但是在循环中settime out不起作用或函数不起作用。 这是我的代码
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这不能正常工作。
答案 0 :(得分:4)
它与超时和循环有关。你需要将它包装在一个闭包中,以便你的超时回调绑定到当时的值z
“。
循环后我也注意到了这一点:
temp = new Array();
generateArray(temp);
当您想要操作延迟操作时,您的阵列不再包含您需要的值。你已经清除了它们。
试试这个:
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"
}
这是a sample with the closure和a sample without it。 3秒后,您将看到没有它的那个将记录所有10个而不是0-10。
答案 1 :(得分:2)
那是因为您在z
中设置的函数中访问变量setTimeout
,创建了一个闭包,并在循环中使用了z
。这意味着,当z
调用函数时,您最终可能会10
等于setTimeout
。
我已经在这里讨论了这个问题和可能的解决方案:How to pass a variable into a setTimeout function?我认为它会对你有帮助!