javascript中的递归setTimeout

时间:2014-01-21 22:50:38

标签: javascript settimeout

是否可以“无限期”运行此操作,而不会导致堆栈溢出或内存不足?

function eternal(){
    var time = recalculateTime();
    doSomething();
    setTimeout(eternal,time);
}

setTimeout(eternal,200000);

我没有使用setInterval,因为触发时间是可变的。

2 个答案:

答案 0 :(得分:6)

这实际上不是递归调用,因为eternal()的第一次调用实际上已在setTimeout()调用下一个调用之前完成。因此,它不是技术上的递归,也不会随着时间的推移而构建堆栈。它可以在没有任何累积的情况下永远运行,这是保持一遍又一遍运行的完美方式。

在回复您的一条评论时,javascript不是多线程的,因此它不会为计时器创建多个线程。每个触发的计时器事件只是将一个事件放入事件队列中,如果当时没有JS正在运行,则触发该事件(从而调用回调函数)。如果JS当时正在运行,JS引擎将等待,直到当前正在执行的JS完成,然后为事件队列中的下一个事件提供服务(从而调用回调)。

答案 1 :(得分:1)

那应该没问题。 setTimeout运行后,它会在eternal函数再次调用之前返回。