当前位置:首页 > JavaScript

throttle js实现

2026-03-14 10:42:55JavaScript

throttle函数实现原理

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

基础实现方式

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选项的实现

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

throttle js实现

  • 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 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现游标

js实现游标

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