防抖(Debounce)和节流(Throttle)的区别和应用场景

防抖(Debounce)和节流(Throttle)虽然都是用来限制函数的执行频率,但它们的实现方式和应用场景有所不同。以下是两者的主要区别:

1. 执行原理

  • 防抖(Debounce):

    • 执行条件:在指定的延迟时间内,如果函数再次被触发,计时器会重新计时,直到延迟时间结束且没有新的触发时,函数才会执行。
    • 效果:确保函数在一段时间内只会执行一次,并且是事件触发后的最后一次。适用于希望在一连串事件结束后执行某个操作的场景。
  • 节流(Throttle):

    • 执行条件:在指定的时间间隔内,函数只会执行一次,无论该时间间隔内事件被触发了多少次。
    • 效果:确保函数在一定时间内最多执行一次。适用于控制持续触发事件的执行频率,防止函数执行过于频繁。

2. 使用场景

  • 防抖(Debounce):

    • 适用于需要在一段时间内等到所有触发事件都完成后再执行函数的场景。
    • 典型应用:搜索框自动补全、窗口大小调整(resize)、表单输入验证。
    • 示例:用户停止输入后的搜索请求发送。
  • 节流(Throttle):

    • 适用于需要定期执行某个函数,而不是立即执行的场景。
    • 典型应用:滚动事件(scroll)、页面滚动加载、按钮重复点击。
    • 示例:限制滚动事件的触发频率。

3. 代码对比

  • 防抖:

    • 每次事件触发都会重置计时器,只有在延迟时间结束后且没有新事件触发,函数才会执行一次。
    javascript 复制代码
    function debounce(func, delay) {
        let timer;
        return function (...args) {
            clearTimeout(timer);
            timer = setTimeout(() => {
                func.apply(this, args);
            }, delay);
        };
    }
  • 节流:

    • 在设定的时间间隔内,函数只能执行一次。即使多次触发,函数也不会立即执行,而是在规定的时间间隔后执行一次。
    javascript 复制代码
    function throttle(func, limit) {
        let lastFunc;
        let lastRan;
        return function (...args) {
            const context = this;
            if (!lastRan) {
                func.apply(context, args);
                lastRan = Date.now();
            } else {
                clearTimeout(lastFunc);
                lastFunc = setTimeout(() => {
                    if ((Date.now() - lastRan) >= limit) {
                        func.apply(context, args);
                        lastRan = Date.now();
                    }
                }, limit - (Date.now() - lastRan));
            }
        };
    }

总结

  • 防抖关注的是在一连串事件结束后执行一次(等待时间内如果有新事件触发就重新计时),强调"最后一次执行"。
  • 节流关注的是在指定时间间隔内执行一次(无论期间有多少次触发),强调"定期执行"。

根据实际需求选择合适的技术,可以有效提升应用的响应速度和用户体验。

相关推荐
喵个咪2 小时前
GoWind CMS 拆解:发布审批——多级推进、逐级角色与全程留痕
前端·后端·go
喵个咪2 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
前端·后端·go
喵个咪2 小时前
GoWind Admin 拆解:打印模板设计器——从画布到服务端 PDF 的完整打印链路
前端·后端·go
总要学点什么2 小时前
第96篇:三维数据加载-城市建筑白模样式+着色器——让色带按体量上色,最白的那档却涂不上去
前端·gis·webgl·cesium·着色器·空间分析·白模
ShineWinsu3 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
Hilaku3 小时前
你们公司有 35 岁以上的前端吗?
前端·javascript·程序员
徐小夕3 小时前
开源Vector-Graph-RAG:向量+图谱双引擎,打破纯向量RAG的效果天花板
前端·vue.js·github
SameX3 小时前
HarmonyOS ArkTS 把组件截图保存成 PNG 再调系统分享面板的做法
前端
Swot4 小时前
SvelteKit SSG 发布后,为什么老访客非要强刷才能看到新内容?
前端
鸿蒙开发4 小时前
小程序存档写到一半怎么办?双槽保存与损坏恢复实战
前端·javascript·react.js