是否可以“无限期”运行此操作,而不会导致堆栈溢出或内存不足?
function eternal(){
var time = recalculateTime();
doSomething();
setTimeout(eternal,time);
}
setTimeout(eternal,200000);
我没有使用setInterval,因为触发时间是可变的。
答案 0 :(得分:6)
这实际上不是递归调用,因为eternal()
的第一次调用实际上已在setTimeout()
调用下一个调用之前完成。因此,它不是技术上的递归,也不会随着时间的推移而构建堆栈。它可以在没有任何累积的情况下永远运行,这是保持一遍又一遍运行的完美方式。
在回复您的一条评论时,javascript不是多线程的,因此它不会为计时器创建多个线程。每个触发的计时器事件只是将一个事件放入事件队列中,如果当时没有JS正在运行,则触发该事件(从而调用回调函数)。如果JS当时正在运行,JS引擎将等待,直到当前正在执行的JS完成,然后为事件队列中的下一个事件提供服务(从而调用回调)。
答案 1 :(得分:1)
那应该没问题。 setTimeout
运行后,它会在eternal
函数再次调用之前返回。