我正在尝试让一些功能一个接一个地工作,它们之间的等待时间为1.5秒。
现在,当我尝试使用相同的Id(在“NoteList(> here<)”内部,如1,2,3或任何其他ID)时,它可以正常工作;
for (var i = 0; i < 36; i++)
{
setTimeout(function () { OnClcRandom(NoteList[0]) }, i * 1000 + 1000);
}
BUT!当我尝试使用var i时,它不起作用并且使页面中的所有功能都卡住了。知道为什么吗?
for (var i = 0; i < 36; i++)
{
setTimeout(function () { OnClcRandom(NoteList[i]) }, i * 1000 + 1000);
}
答案 0 :(得分:1)
那是因为所有函数都引用相同的 live i
变量,而不是调用setTimeout()
时变量的值。这意味着,当超时实际运行时,您的功能i
将为36
。
请改为尝试:
for (var i = 0; i < 36; i++) {
(function(x){
setTimeout(function () { OnClcRandom(NoteList[x]) }, i * 1000 + 1000);
)(i);
}
这会在循环的每次迭代中执行一个匿名函数,每次执行都会获得自己的x
参数,以便在原始函数中使用。
答案 1 :(得分:1)
Javascript不会为块创建本地范围。 :)
在你的第二个例子中,var i等于36(最后一个值)。 您需要在循环内创建局部范围。
for (var i = 0; i < 36; i++) {
(function (i) {
setTimeout(.......);
}(i))
}
您也可以修复'i'值将其分配给函数属性:
for (var i = 0, f; i < 36; i++){
f = function _callback() { var i = _callback.i; .....};
f.i = i;
setTimeout(f, i * 1000);
}