当前位置:首页 > JavaScript

js防抖和节流实现

2026-02-28 18:20:08JavaScript

防抖(Debounce)的实现

防抖的核心思想是在事件触发后等待一段时间再执行回调,若在等待期间再次触发事件,则重新计时。适用于输入框搜索联想、窗口大小调整等场景。

基础实现:

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

立即执行版本:

function debounce(func, delay, immediate) {
  let timeoutId;
  return function(...args) {
    const context = this;
    const later = () => {
      timeoutId = null;
      if (!immediate) func.apply(context, args);
    };
    const callNow = immediate && !timeoutId;
    clearTimeout(timeoutId);
    timeoutId = setTimeout(later, delay);
    if (callNow) func.apply(context, args);
  };
}

节流(Throttle)的实现

节流的核心思想是在固定时间间隔内只执行一次回调。适用于滚动事件、高频点击等场景。

时间戳版本:

function throttle(func, limit) {
  let lastTime;
  return function(...args) {
    const now = Date.now();
    if (!lastTime || now - lastTime >= limit) {
      func.apply(this, args);
      lastTime = now;
    }
  };
}

定时器版本:

function throttle(func, limit) {
  let timeoutId;
  return function(...args) {
    if (!timeoutId) {
      timeoutId = setTimeout(() => {
        func.apply(this, args);
        timeoutId = null;
      }, limit);
    }
  };
}

结合版本(更精确控制):

function throttle(func, limit) {
  let lastTime = 0;
  let timeoutId;
  return function(...args) {
    const now = Date.now();
    const remaining = limit - (now - lastTime);
    if (remaining <= 0) {
      if (timeoutId) {
        clearTimeout(timeoutId);
        timeoutId = null;
      }
      func.apply(this, args);
      lastTime = now;
    } else if (!timeoutId) {
      timeoutId = setTimeout(() => {
        func.apply(this, args);
        timeoutId = null;
        lastTime = Date.now();
      }, remaining);
    }
  };
}

使用示例

防抖示例:

const searchInput = document.getElementById('search');
const debouncedSearch = debounce(function() {
  console.log('Searching:', this.value);
}, 500);
searchInput.addEventListener('input', debouncedSearch);

节流示例:

window.addEventListener('scroll', throttle(function() {
  console.log('Scrolling:', window.scrollY);
}, 200));

关键区别

防抖在连续触发时只执行最后一次,节流在固定时间间隔内必定执行一次。根据实际场景需求选择合适的方法。高频事件中需要即时反馈用节流,只需最终结果用防抖。

js防抖和节流实现

标签: 防抖js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inp…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: cons…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…