递归 setTimeouts 对性能有害吗?

Pix*_*ode 6 javascript recursion settimeout

我按照 W3Schools 的本教程创建了一个图像幻灯片:https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_slideshow_auto

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

var slideIndex = 0;
showSlides();

function showSlides() {
  var i;
  var slides = document.getElementsByClassName("mySlides");
  var dots = document.getElementsByClassName("dot");
  for (i = 0; i < slides.length; i++) {
    slides[i].style.display = "none";
  }
  slideIndex++;
  if (slideIndex > slides.length) {
    slideIndex = 1
  }
  for (i = 0; i < dots.length; i++) {
    dots[i].className = dots[i].className.replace(" active", "");
  }
  slides[slideIndex - 1].style.display = "block";
  dots[slideIndex - 1].className += " active";
  setTimeout(showSlides, 2000); // Change image every 2 seconds
}
Run Code Online (Sandbox Code Playgroud)

sam*_*ime 8

如果通过递归,你的意思是 asetTimeout最终调用另一个(或更常见的是它本身),那么不是。

事实上,这是首选的方法。

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

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

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

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

  • @ErichKitzmueller 呵呵,早期当我的代码不太健壮时,我对这个特殊的“setInterval”哥特卡有很多第一手经验,这就是为什么我后来更喜欢在最后再次调用自己的“setTimeout” 。 (2认同)