Javascript 递归设置超时对性能有害吗?

Javascript 递归设置超时对性能有害吗?,javascript,recursion,settimeout,Javascript,Recursion,Settimeout,根据W3Schools提供的本教程,我创建了一个图像幻灯片: 它通过setTimeout()使用递归函数自动滑动图像。这对用户的浏览器性能有害吗?或者我可以不用担心就使用它吗 var slideIndex=0; 放映幻灯片(); 函数showSlides(){ var i; var slides=document.getElementsByClassName(“mySlides”); var dots=document.getElementsByClassName(“dot”); 对于(i=0;

根据W3Schools提供的本教程,我创建了一个图像幻灯片:

它通过
setTimeout()
使用递归函数自动滑动图像。这对用户的浏览器性能有害吗?或者我可以不用担心就使用它吗

var slideIndex=0;
放映幻灯片();
函数showSlides(){
var i;
var slides=document.getElementsByClassName(“mySlides”);
var dots=document.getElementsByClassName(“dot”);
对于(i=0;i幻灯片长度){
slideIndex=1
}
对于(i=0;i
由于浏览器在接下来的2秒钟内应该什么都不做,因此与setInterval()相比,递归setTimeout()的任何假设开销都可以安全地忽略。但当您使用setTimeout()精确模拟setInterval()时,您的程序可能更难理解。出于这个原因,我宁愿使用setInterval来进行幻灯片放映


也就是说,在node.js上的某些应用程序中,我体验到setInterval()有一点漂移,因此使用setTimeout()可以获得更精确的计时。但是在幻灯片放映的用例中,可以忽略每个间隔几毫秒的微小漂移。

因为浏览器在另外2秒钟内应该什么都不做,所以可以安全地忽略递归setTimeout()与setInterval()相比的任何假设开销。但当您使用setTimeout()精确模拟setInterval()时,您的程序可能更难理解。出于这个原因,我宁愿使用setInterval来进行幻灯片放映


也就是说,在node.js上的某些应用程序中,我体验到setInterval()有一点漂移,因此使用setTimeout()可以获得更精确的计时。但是在幻灯片放映的用例中,可以忽略每个间隔几毫秒的微小漂移。

如果是递归,您指的是一个
setTimeout
,它最终调用另一个(或更常见的是它本身),那么就没有了

事实上,这是最好的方法

通过使用
setTimeout
它可以让浏览器在更新之间进行中断,以进行其他更新(也称为“非阻塞”)

您也可以使用
setInterval
并让它运行,但问题是如果出现问题,您必须显式调用
clearInterval
,否则它会不断抛出错误

setTimeout
只会抛出一个错误并停止(因为它不会使调用发出另一个
setTimeout
setTimeout
绝对是我和其他许多人的首选方法


它也不会产生任何类型的堆栈溢出(就像正常的递归函数,如果它们递归太长的话),因为从这个意义上讲,它不是真正的递归。

如果递归,你指的是一个
setTimeout
,最终调用另一个(或者更常见的是它本身),那么就没有了

事实上,这是最好的方法

通过使用
setTimeout
它可以让浏览器在更新之间进行中断,以进行其他更新(也称为“非阻塞”)

您也可以使用
setInterval
并让它运行,但问题是如果出现问题,您必须显式调用
clearInterval
,否则它会不断抛出错误

setTimeout
只会抛出一个错误并停止(因为它不会使调用发出另一个
setTimeout
setTimeout
绝对是我和其他许多人的首选方法


它也不会产生任何类型的堆栈溢出(就像正常的递归函数,如果它们递归太长的话),因为从这个意义上讲,它不是真正的递归。

当调用
setTimeout
时,JS runtime调度指定回调的执行。这不是递归,因为我们不等待回调返回值

试着看看
setTimeout
,就像是一个填满时间表的东西,基本上是一个setter。如果您在上午8:00:00调用
setTimeout(callback,2000)
,JS运行时可能会对您说:“好的!我将在上午8:00:02执行该回调,但在等待时我仍然可以做其他事情。”


希望这会有所帮助。

当调用
setTimeout
时,JS运行时会安排执行指定的回调。这不是递归,因为我们不等待回调返回值

试着看看
setTimeout
,就像是一个填满时间表的东西,基本上是一个setter。如果您在上午8:00:00调用
setTimeout(callback,2000)
,JS运行时可能会对您说:“好的!我将在上午8:00:02执行该回调,但在等待时我仍然可以做其他事情。”


希望这有帮助。

是的,这是可以接受的,并且经常建议使用它来代替
setInterval
。虽然延迟超时调用实际上不是递归的。是的,这是可以接受的,并且通常建议使用它来代替
setInterval
。虽然延迟超时调用实际上不是递归的。@Erichkizmueller Heh,在我的代码不太健壮的早期,我有很多关于
setInterval
这个特殊的gothca的第一手经验,这就是为什么我喜欢在最后再次调用自己的
setTimeout
。@Erichkizmueller Heh,早些时候,当我的代码不够健壮时,我对这个特殊的gothca of
setInterval
有很多第一手经验,这就是为什么我喜欢在最后再次调用自己的
setTimeout