循环中的eval和setTimeout

时间:2011-07-22 09:46:19

标签: javascript eval settimeout

我在数组中持有代码行,并尝试使用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);
}

我该怎么办? 感谢

2 个答案:

答案 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)将在全局范围内对其进行评估。

这可能与您有关。