当前位置:首页 > JavaScript

节流js实现

2026-01-15 13:51:43JavaScript

节流(Throttle)的实现原理

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

基础实现方式

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

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

定时器实现方式

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

function throttle(func, delay) {
  let timer = null;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        func.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

综合优化版本

结合时间戳和定时器,既保证首次立即执行,又确保尾调用执行:

function throttle(func, delay) {
  let lastTime = 0;
  let timer = null;
  return function(...args) {
    const now = Date.now();
    const remaining = delay - (now - lastTime);

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

使用示例

const handleScroll = throttle(() => {
  console.log('Scroll event handler');
}, 200);

window.addEventListener('scroll', handleScroll);

参数配置扩展

支持配置首次和末次是否执行:

function throttle(func, delay, options = {}) {
  let { leading = true, trailing = true } = options;
  let lastTime = 0;
  let timer = null;

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

    if (remaining <= 0) {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      func.apply(this, args);
      lastTime = now;
    } else if (trailing && !timer) {
      timer = setTimeout(() => {
        func.apply(this, args);
        timer = null;
        lastTime = leading ? Date.now() : 0;
      }, remaining);
    }
  };
}

注意事项

  • 节流时间间隔需根据实际场景调整,过短会失去节流效果,过长会影响用户体验
  • 使用箭头函数时需注意this绑定问题
  • 在组件卸载时需要清除定时器避免内存泄漏

节流js实现

标签: js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现跳转

js实现跳转

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

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swip…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…