函数防抖

// 函数防抖是一种在多次连续触发事件后只执行一次回调函数的技术。它通常使用在那些需要做性能优化或减少网络请求的场合。函数防抖的实现方法是设置一个定时器,在指定时间间隔内多次触发事件时,如果该时间间隔内有新的事件触发,则清除之前的定时器并重新设置新的定时器,等待时间间隔结束后再执行回调函数。如果在时间间隔内没有新的事件触发,则执行回调函数。下面是一个使用函数防抖的示例,每次输入框输入时都会触发一个 AJAX 请求,但是我们不希望每次输入时都发送请求,而是希望用户停止输入一段时间后再发送请求,以减少网络请求量和提高性能:
function debounce(callback, delay) {
  let timerId = null;
  return function() {
    clearTimeout(timerId);
    timerId = setTimeout(() => {
      callback.apply(this, arguments);
    }, delay);
  }
}
function fetchData() {
  // 发送 AJAX 请求
}
const inputElement = document.getElementById('input');
inputElement.addEventListener('input', debounce(fetchData, 500));

//在这个示例中,我们首先获取输入框的引用,然后定义了一个  `debounce()`  函数来创建一个防抖函数。该防抖函数将在指定的时间间隔内多次触发回调函数,但只会在时间间隔结束后执行一次回调函数。然后,我们定义了一个名为  `fetchData()`  的函数来发送 AJAX 请求。注意,这个函数将在防抖函数中作为回调函数传递,因此它不应该直接在  `input`  事件监听器中调用。最后,我们调用  `addEventListener()`  方法来添加一个  `input`  事件监听器。在这里,我们将使用  `debounce()`  函数来创建一个新的回调函数,该回调函数将在  `input`  事件上触发,并在 500 毫秒的时间间隔内多次执行。每当回调被执行时,防抖函数会清除当前的定时器并重新设置一个新的定时器,等待时间间隔结束后再执行  `fetchData()`  函数。这样,当用户连续输入时,防抖函数会多次调用,但是只有在用户停止输入一段时间后才会发送 AJAX 请求,以减少网络请求量和提高性能。

函数节流

//函数节流(Throttling)是一种优化方式,有助于减少 Web 应用的资源占用率。函数节流可以确保每 X 毫秒只执行一次函数。在 JavaScript 中,可以使用 timestamp 和计时器等技术来实现函数节流。
function throttle(callback, delay) {
  let lastCall = 0;
  return function() {
    const now = new Date().getTime();
    if (now - lastCall < delay) {
      return;
    }
    lastCall = now;
    callback.apply(this, arguments);
  }
}
 const headerElement = document.getElementById('header');
window.addEventListener('scroll', throttle(function() {
  if (window.scrollY > 100) {
    headerElement.style.display = 'none';
  } else {
    headerElement.style.display = 'block';
  }
}, 250));

//在这个示例中,我们首先定义了一个  `throttle()`  函数来创建一个节流函数。该节流函数将在指定的时间间隔内最多调用一次传入的回调函数。然后,我们获取网页头部元素的引用,然后调用  `addEventListener()`  方法来添加滚动事件的监听器。在这里,我们将使用  `throttle()`  函数来创建一个新的回调函数,该回调函数将在  `scroll`  事件上触发,并在指定的延迟时间间隔内最多触发一次。每次回调被触发时,我们检查纵向滚动距离是否超过 100 像素。如果是,我们将  `headerElement`  的样式`display`  属性设置为  `'none'` ,这样它就会消失。否则,我们将其  `display`  属性设置为  `'block'` ,使其重新出现。请注意,这里使用的时间间隔为 250 毫秒,您可以根据需要自行调整。
Last Updated:
Contributors: pengrengui