我在数组中持有代码行,并尝试使用setTimeout()逐个单元地运行它们。
这样可以很好地执行代码:
for (i=0; i<restorePoints.length; i++){
eval(restorePoints[i]);
}
但是我想在每次迭代之间有一个短暂的延迟:我想使用setTimeout()而不是eval()。出于某种原因,这些都不起作用:
for (i=0; i<restorePoints.length; i++){
setTimeout(restorePoints[i],1000);
}
或
for (i=0; i<restorePoints.length; i++){
setTimeout(eval(restorePoints[i]),1000);
}
我该怎么办? 感谢
答案 0 :(得分:2)
如果您打算以这两种方式执行此操作,则需要将函数调用包装在匿名函数中:
for (i=0; i<restorePoints.length; i++){
setTimeout(function(){eval(restorePoints[i]}),1000);
}
否则你没有将eval设置为在超时时触发,你设置执行Javascript代码的结果(在这种情况下可能是什么)是setTimeout正在操作的事情。
答案 1 :(得分:2)
循环很快。它将连续创建所有超时,因此所有超时都将同时触发。你可以让时间依赖于循环变量,即增加每次迭代的时间,或者,我会做的,只使用一次超时和递归调用:
(function() {
var data = restorePoints;
var run = function(i) {
setTimeout(function() {
var entry = data[i];
if(entry) {
eval(entry);
run(i+1);
}
}, 1000);
};
run(0);
}());
请注意,除了延迟之外,eval(string)
和setTimeout(string, ...)
之间存在差异:
eval
将评估当前范围中的参数,而setTimeout
(和setInterval
)将在全局范围内对其进行评估。
这可能与您有关。