当前位置:首页 > JavaScript

js截流实现

2026-04-06 20:13:46JavaScript

截流(Throttle)的概念

截流是一种控制函数执行频率的技术,确保函数在特定时间间隔内只执行一次。常用于优化高频事件(如滚动、输入)的性能。

基础实现

使用时间戳判断是否执行函数:

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

包含尾部调用版本

确保最后一次触发会被执行:

function throttle(fn, delay) {
  let timer = null;
  let lastTime = 0;

  return function(...args) {
    const now = Date.now();
    const remaining = delay - (now - lastTime);

    clearTimeout(timer);

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

使用场景示例

滚动事件优化:

window.addEventListener('scroll', throttle(() => {
  console.log('处理滚动逻辑');
}, 200));

与防抖(Debounce)的区别

  • 截流:固定时间间隔执行(如每200ms)
  • 防抖:停止触发后延迟执行(如输入停止500ms后)

现代浏览器原生支持

部分浏览器已支持requestIdleCallback

js截流实现

window.requestIdleCallback(() => {
  // 空闲时执行的任务
});

注意事项

  • 时间间隔不宜过短(建议≥16ms,对应60fps)
  • 在React等框架中可能需要使用useCallback包裹
  • 清除定时器避免内存泄漏

标签: js
分享给朋友:

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…