第一次直接调用函数最简单:
foo();
setInterval(foo, delay);
然而,有充分的理由避免setInterval
个事件——特别是在某些情况下,setInterval
个事件的全部负载可以立即到达,而不会有任何延迟.另一个原因是,如果要停止循环,必须显式调用clearInterval
,这意味着您必须记住从最初的setInterval
调用返回的句柄.
因此,另一种方法是让foo
自己触发后续呼叫,而不是使用setTimeout
:
function foo() {
// do stuff
// ...
// and schedule a repeat
setTimeout(foo, delay);
}
// start the cycle
foo();
这保证了在呼叫之间有at least个间隔delay
.如果需要,还可以更容易地取消循环-只要在达到循环终止条件时不调用setTimeout
即可.
更好的是,您可以将所有这些都封装在immediately invoked function expression中,这将创建函数,然后该函数会像上面一样再次调用自身,并自动启动循环:
(function foo() {
...
setTimeout(foo, delay);
})();
它定义了函数并一次启动循环.