当前位置:首页 > JavaScript

js防抖和节流实现

2026-04-03 18:46:43JavaScript

防抖(Debounce)

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

function debounce(fn, delay) {
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(context, args);
    }, delay);
  };
}

节流(Throttle)

节流的原理是在固定时间间隔内只执行一次回调函数。适用于滚动事件、高频点击按钮等场景。

function throttle(fn, interval) {
  let lastTime = 0;
  return function() {
    const context = this;
    const args = arguments;
    const now = Date.now();
    if (now - lastTime >= interval) {
      fn.apply(context, args);
      lastTime = now;
    }
  };
}

时间戳与定时器结合的节流

结合时间戳和定时器实现更精确的节流,确保最后一次触发能执行回调。

js防抖和节流实现

function throttle(fn, interval) {
  let lastTime = 0;
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    const now = Date.now();
    const remaining = interval - (now - lastTime);

    if (remaining <= 0) {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      fn.apply(context, args);
      lastTime = now;
    } else if (!timer) {
      timer = setTimeout(() => {
        fn.apply(context, args);
        lastTime = Date.now();
        timer = null;
      }, remaining);
    }
  };
}

使用示例

// 防抖示例
const debouncedSearch = debounce(function(query) {
  console.log('Searching for:', query);
}, 500);

document.getElementById('search').addEventListener('input', (e) => {
  debouncedSearch(e.target.value);
});

// 节流示例
const throttledScroll = throttle(function() {
  console.log('Scrolled');
}, 1000);

window.addEventListener('scroll', throttledScroll);

区别与应用场景

  • 防抖:连续触发事件时,只在最后一次触发后执行回调。适用于输入框实时搜索、表单验证等场景。
  • 节流:固定时间间隔内只执行一次回调。适用于滚动加载、高频点击等场景。

两种方法均通过闭包保存状态,避免全局污染。实际开发中可根据需求选择或结合使用。

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

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…