只要定义超时前的函数
for(var i=0; nextFunction = aList[i];i++) {
var waitAndDoSomething = function(func) {
return function() { func.doSomething(); }
};
setTimeout(waitAndDoSomething(nextFunction),500*i);
}
另一个可能的答案
在 minitect 的建议下,我开始考虑其他可能的解决方案。我觉得干净的解决方案是使用bind
String.prototype.doSomething = function() { alert(this); } // Just for testing
var aList = ['one', 'two', 'three']; // Just for testing
for(var i=0;obj = aList[i];i++) {
setTimeout(obj.doSomething.bind(obj),500*i);
}
但是,我不确定这在 Razor Storm 问题的上下文中效果如何,因为我不知道 aList[i] 代表什么。
这能回答问题吗
我也想知道这是否是预期的行为。它实际上不会在执行后休眠,而是设置时间。这可能是骗人的,但是如果我们真的想执行一个函数,然后在下一个函数之前休眠半秒,我们的时间就在这里了。相反,我会使用递归:
String.prototype.doSomething = function() { alert(this); }
var aList = ['one', 'two', 'three'];
var doNextSomething = function(index) {
if (!index) { index = 0 }
if (nextObject = aList[index]) {
nextObject.doSomething();
setTimeout(doNextSomething, 500, index + 1);
}
};
doNextSomething();
现在,它会在函数执行后等待 500 毫秒(在长时间运行的任务中很明显)。
我认为发布的答案更符合 Razor Storm 的想法。