防抖节流(立即执行/非立即执行)

本文深入探讨了JavaScript中的防抖(debounce)和节流(throttling)技术,通过示例代码展示了它们的区别。防抖在事件频繁触发时仅允许最后一次执行,而节流则在设定的时间间隔内执行一次。关键区别在于首次触发时的行为:防抖会清除定时器重新开始,而节流则返回false等待定时器自动清除。这两种技术常用于优化性能,如滚动事件监听和窗口resize处理。

下面的两个都是立即执行版:

// debounce 防抖
        function debounce (fn,immediate) {
            var timer;
            return function() {
                if(timer)  clearTimeout(timer);
                immediate && !timer && fn();  // 首次进入,立即执行(立即执行开启,定时器没开启)
                timer = setTimeout(() => {
                    timer = null;
                }, 1000)
            }
        }

        // throttling 节流
        function throttling(fn,immediate) {
            var timer;
            return function () {
                if (timer) return false;
                !timer && immediate && fn();
                timer = setTimeout(() => {
                    timer = null;
                }, 1000)
            }
        }

        document.getElementById("btn").onclick = throttling(function () {
            console.log(1)
        },true)

总结: 可以发现防抖节流的区别在于 一开始的判断定时器存在所做的处理,防抖是清除定时器重新来,节流是 return false 等待定时器自动清除。

### JavaScript 防抖节流的实现及其应用场景 #### 实现方式 防抖 (Debounce)节流 (Throttle) 是两种用于优化高频率事件处理的技术。 对于 **防抖** 的实现,当触发事件时,在设定的时间内如果没有再次触发,则执行函数;如果在这段时间内又触发了该事件,则重新计时: ```javascript function debounce(func, wait) { let timeout; return function(...args) { clearTimeout(timeout); timeout = setTimeout(() => func.apply(this, args), wait); }; } ``` 而 **节流** 则是在一定时间内只允许一次操作被执行。通常有两种形式:首次立即执行或等待一段时间后再执行: ```javascript function throttle(func, limit) { let inThrottle; return function() { const args = arguments; const context = this; if (!inThrottle) { func.apply(context, args); inThrottle = true; setTimeout(() => inThrottle = false, limit); } }; } ``` 这两种方法都可以有效地减少不必要的计算资源浪费并提高用户体验[^1]。 #### 应用场景 - **输入框自动补全**: 使用 `debounce` 可以防止用户每敲击一个字符就发送请求查询建议列表,而是等到用户停止打字后的指定时间间隔再发起请求。 - **窗口调整大小监听器**: 当浏览器窗口尺寸发生变化时会频繁触发 resize 事件,此时可以采用 `throttle` 来控制回调函数调用次数,从而减轻性能压力[^3]. - **无限滚动加载更多数据**: 用户快速向下滚动页面时可能连续触底多次,通过应用 `debounce`, 确保只有在用户真正停下来之后才去获取新一批的数据项[^2].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值