当前位置:首页 > JavaScript

throttle js实现

2026-03-14 10:42:55JavaScript

throttle js实现

throttle函数实现原理

节流(throttle)是一种限制函数执行频率的技术,确保函数在指定时间间隔内最多执行一次。常用于滚动事件、窗口调整等高频触发的场景。

throttle js实现

基础实现方式

function throttle(func, delay) {
  let lastCall = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastCall < delay) return;
    lastCall = now;
    return func.apply(this, args);
  };
}

包含leading和trailing选项的实现

更完善的实现通常提供两个选项:

  • leading:是否立即执行第一次调用
  • trailing:是否在时间间隔结束后执行最后一次调用
function throttle(func, wait, options = {}) {
  let timeout, context, args, result;
  let previous = 0;

  const later = function() {
    previous = options.leading === false ? 0 : Date.now();
    timeout = null;
    result = func.apply(context, args);
    if (!timeout) context = args = null;
  };

  const throttled = function(...params) {
    const now = Date.now();
    if (!previous && options.leading === false) previous = now;
    const remaining = wait - (now - previous);
    context = this;
    args = params;

    if (remaining <= 0 || remaining > wait) {
      if (timeout) {
        clearTimeout(timeout);
        timeout = null;
      }
      previous = now;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    } else if (!timeout && options.trailing !== false) {
      timeout = setTimeout(later, remaining);
    }
    return result;
  };

  throttled.cancel = function() {
    clearTimeout(timeout);
    previous = 0;
    timeout = context = args = null;
  };

  return throttled;
}

使用示例

// 基础用法
const throttledScroll = throttle(() => {
  console.log('Scroll event handler');
}, 200);

window.addEventListener('scroll', throttledScroll);

// 带选项的用法
const throttledResize = throttle(() => {
  console.log('Resize event handler');
}, 500, { leading: true, trailing: true });

window.addEventListener('resize', throttledResize);

注意事项

  • 时间间隔参数应根据实际需求调整,过短可能达不到节流效果,过长会影响用户体验
  • 在组件卸载时应取消节流函数,避免内存泄漏
  • 对于React组件,可在useEffect中返回取消函数
useEffect(() => {
  const throttledHandler = throttle(handler, 300);
  window.addEventListener('resize', throttledHandler);
  return () => {
    throttledHandler.cancel();
    window.removeEventListener('resize', throttledHandler);
  };
}, [handler]);

标签: throttlejs
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…