当前位置: 首页 > news >正文

通用节流函数

节流函数的作用是在指定的时间间隔内只允许目标函数执行一次,从而限制函数的调用频率。


节流函数的核心思想:
  • 在事件触发时,记录当前时间。
  • 如果距离上一次函数执行的时间间隔小于设定的时间,则忽略此次触发。
  • 如果时间间隔足够长,则执行目标函数,并更新上次执行的时间。

节流函数的实现:

以下是一个常见的节流函数实现:

function throttle(fn, limit = 1000) {
    let lastCall = 0; // 记录上一次函数执行的时间
    return function (...args) {
        const now = new Date().getTime(); // 获取当前时间
        if (now - lastCall >= limit) { // 如果距离上次执行已经超过限制时间
            lastCall = now; // 更新最后一次执行的时间
            fn.apply(this, args); // 执行目标函数
        }
    };
}
示例 1:滚动事件节流
// 定义一个目标函数
function handleScroll() {
    console.log('页面滚动了!');
}

// 创建节流函数
const throttledScroll = throttle(handleScroll, 500);

// 绑定滚动事件
window.addEventListener('scroll', throttledScroll);

在这个例子中,handleScroll 函数只会每 500 毫秒最多执行一次,即使用户快速滚动页面。


示例 2:按钮点击节流
// 定义一个目标函数
function handleClick() {
    console.log('按钮被点击了!');
}

// 创建节流函数
const throttledClick = throttle(handleClick, 2000);

// 绑定点击事件
document.querySelector('#myButton').addEventListener('click', throttledClick);

在这个例子中,即使用户快速多次点击按钮,handleClick 函数也只会每 2 秒最多执行一次。


防抖 vs 节流的区别总结:
特性防抖(Debounce)节流(Throttle)
定义在指定时间内,只有最后一次触发才会执行函数。在指定时间内,函数最多执行一次。
适用场景输入框搜索、窗口调整大小等需要等待的操作。滚动事件、鼠标移动等需要控制频率的操作。
执行次数在触发事件停止后执行一次。在触发事件期间,按固定间隔执行多次。

节流的其他实现方式:

除了基于时间戳的实现,节流还可以通过定时器来实现。以下是基于定时器的节流函数实现:

function throttle(fn, limit = 1000) {
    let timeoutId; // 用于存储定时器的 ID
    return function (...args) {
        if (!timeoutId) { // 如果没有定时器在运行
            timeoutId = setTimeout(() => {
                fn.apply(this, args); // 执行目标函数
                timeoutId = null; // 清空定时器
            }, limit);
        }
    };
}

这种实现方式的优点是逻辑更简单,适合某些特定场景。


总结:

节流函数通过限制函数的调用频率,能够有效减少不必要的计算和资源消耗,特别适用于需要频繁触发但不需要每次响应的场景,比如滚动事件、窗口调整大小等。

相关文章:

  • 前缀和、区间和的差别
  • 第一节 Python简介、标识符、注释、六大数据类型简介、for循环、运算符
  • Vue极简插件安装
  • 【快速入门】Unity 常用组件(功能块)
  • 自定义组件数据监听器案例,纯数据字段,自定义组件生命周期,页面的生命周期,插槽
  • C++ references
  • XMOS的多项音频技术创新将大模型与边缘AI应用密切联系形成生态化合
  • Map 和 Set
  • 类与对象C++详解(中)-----构造函数与析构函数
  • 大数据学习(46) - Flink按键分区处理函数
  • dl学习笔记(11):VGG,NIN,GooleNet经典架构pytorch实现
  • 跳跃游戏 II - 贪心算法解法
  • nacos2.0.4源码启动
  • win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录
  • PHP 数组与数据结构详解
  • 【NLP 22、语言模型 language model】
  • Kotlin 扩展
  • 排序与查找算法(C语言实现)
  • 【Linux开发工具】调试器-gdb
  • 【动态路由】系统Web URL资源整合系列(后端技术实现)【nodejs实现】
  • 北方将现今年首场大范围高温天气,山西河南山东陕西局地可超40℃
  • 俄乌官员即将在土耳其会谈,外交部:支持俄乌开启直接对话
  • “AD365特应性皮炎疾病教育项目”启动,助力提升认知与规范诊疗
  • 龚正市长调研闵行区,更加奋发有为地稳增长促转型,久久为功增强发展后劲
  • 郑培凯:汤显祖的“至情”与罗汝芳的“赤子之心”
  • 王毅谈中拉论坛十年成果