当前位置:首页 > JavaScript

js防抖和节流实现

2026-04-03 18:46:43JavaScript

防抖(Debounce)

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

js防抖和节流实现

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)

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

js防抖和节流实现

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;
    }
  };
}

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

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

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实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js实现搜索

js实现搜索

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

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…