Javascript 制作Winnilla js滑块时代码行出现问题

Javascript 制作Winnilla js滑块时代码行出现问题,javascript,slider,Javascript,Slider,我看了一个关于制作vanilla JS滑块的教程,我理解了整个代码,因为它非常简单,但是一行代码对我来说没有任何意义,即使你删除了那行代码,滑块工作得非常好,你能给我解释一下它的功能吗?因为制作视频的人没有解释那行代码的功能 我不理解的代码行,它在代码中做什么 setTimeout(() => current.classList.remove('current')); 还有整个JS代码 const slides = document.querySelectorAll('.slide')

我看了一个关于制作vanilla JS滑块的教程,我理解了整个代码,因为它非常简单,但是一行代码对我来说没有任何意义,即使你删除了那行代码,滑块工作得非常好,你能给我解释一下它的功能吗?因为制作视频的人没有解释那行代码的功能

我不理解的代码行,它在代码中做什么

 setTimeout(() => current.classList.remove('current'));
还有整个JS代码

const slides = document.querySelectorAll('.slide');
const next = document.querySelector('#next');
const prev = document.querySelector('#prev');
const auto = false; // Auto scroll
const intervalTime = 5000;
let slideInterval;

const nextSlide = () => {
  // Get current class
  const current = document.querySelector('.current');
  // Remove current class
  current.classList.remove('current');
  // Check for next slide
  if (current.nextElementSibling) {
    // Add current to next sibling
    current.nextElementSibling.classList.add('current');
  } else {
    // Add current to start
    slides[0].classList.add('current');
  }
  setTimeout(() => current.classList.remove('current'));
};

const prevSlide = () => {
  // Get current class
  const current = document.querySelector('.current');
  // Remove current class
  current.classList.remove('current');
  // Check for prev slide
  if (current.previousElementSibling) {
    // Add current to prev sibling
    current.previousElementSibling.classList.add('current');
  } else {
    // Add current to last
    slides[slides.length - 1].classList.add('current');
  }
  setTimeout(() => current.classList.remove('current'));
};

// Button events
next.addEventListener('click', e => {
  nextSlide();
  if (auto) {
    clearInterval(slideInterval);
    slideInterval = setInterval(nextSlide, intervalTime);
  }
});

prev.addEventListener('click', e => {
  prevSlide();
  if (auto) {
    clearInterval(slideInterval);
    slideInterval = setInterval(nextSlide, intervalTime);
  }
});

// Auto slide
if (auto) {
  // Run next slide at interval time
  slideInterval = setInterval(nextSlide, intervalTime);
}
这是整个代码的链接。

由于这是一个设置超时,因此此函数调用:

() => current.classList.remove('current');
发生在与全局上下文完全不同的执行上下文上(顺便说一句,如果在setTimeout中发出第二个参数,则这意味着它发生在0毫秒内,尽管是瞬时的,但鉴于它是setTimeout函数的性质,它仍然发生在正常事件循环之外)


因此,我认为Brad将其作为故障保险的证据,如果你随意点击下一个或上一个按钮,那么指向你刚才跳过的当前幻灯片的指针将始终从其类列表中删除“当前”类。

在我看来,在这种情况下没有必要,但这是因为
current.classList.remove('current')
不会执行
setTimeout(()=>current.classList.remove('current'))中的代码;
将最后执行。这就像是一种保险。看看简短的理论:

console.log('One');
setTimeout(()=>console.log('Two'));
console.log('Three');

The console logs: One, Three, Two.
这是因为setTimeout中的代码被设置为回调queque,并且只有当堆栈为空时才会执行,因为setTimeout是一个异步函数。(setTimeout是一个Web API函数,因此,在堆栈中之后和在回调queque中之前,将推送到Web API框中)