节流、防抖

博客介绍了节流和防抖技术,用于处理事件处理函数高频调用,减少浏览器负担。节流尽量减少触发次数,按固定时间间隔执行;防抖则是在一定时间段无触发后执行一次。还举例说明在页面无限加载场景下,节流更适用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

节流和防抖主要处理事件处理函数高频调用,减少浏览器负担

节流:尽量减少触发次数,mint-ui上封装了一个方法

    <script>
        var throttle = function (fn, delay) {
            var now, lastExec, timer, context, args; //eslint-disable-line

            var execute = function () {
                fn.apply(context, args);
                lastExec = now;
            };

            return function () {
                context = this;
                args = arguments;
                now = Date.now();
                if (timer) {
                    clearTimeout(timer);
                    timer = null;
                }
                console.log(lastExec)
                if (lastExec) {
                    var diff = delay - (now - lastExec);
                    if (diff < 0) {
                        execute();
                    } else {
                        timer = setTimeout(() => {
                            execute();
                        }, diff);
                    }
                } else {
                    execute();
                }
            };
        };
        var scrolls = throttle(aaa, 1000);
        function  aaa(){
            console.log(111111)
        }
        scrolls();
        scrolls();
        scrolls();
        scrolls();
        scrolls();
        scrolls();
        scrolls();
    </script>

throttle 方法return出来一个方法(闭包),所以throttle执行完后,在闭包里使用的局部变量和方法都没有销毁,将每次执行fn的时间记录到lastExec变量中。
第一次时fn会被执行,以后都会有delay时间的限制,delay时间一到就会执行一次事件处理函数。
最后的输出结果是
在这里插入图片描述

防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。
上来不会执行,当满足指定的时间后才会执行
也就是将几次操作合并为一次操作进行

function debounce(fn, wait) {    
    var timeout = null;    
    return function() {        
        if(timeout !== null)   clearTimeout(timeout);        
        timeout = setTimeout(fn, wait);    
    }
}

借用别人总结的话:函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

### 节流防抖的概念 #### 防抖 (Debounce) 防抖是一种技术手段,其核心思想是在一定时间内只允许某件事情发生一次。如果在这段时间内再次触发,则重新计时。这种方法适用于需要延迟执行某些操作的场景,比如输入框中的实时搜索功能[^1]。 以下是防抖的一个典型实现: ```javascript function debounce(fn, wait) { let timer = null; return function(...args) { const context = this; clearTimeout(timer); // 清除之前的定时器 timer = setTimeout(() => { fn.apply(context, args); }, wait); }; } ``` 通过上述代码可以看出,在每次事件触发时都会清除前一个未完成的定时器并设置一个新的定时器,只有当最后一次触发之后等待指定时间才真正执行目标函数[^3]。 --- #### 节流 (Throttle) 节流则是指在一段时间内最多只能执行一次特定的操作。即使该时间段内多次触发同一事件,也只会按照设定频率来响应。这通常应用于像无限滚动加载这样的情况中[^2]。 下面是一个简单的节流实现例子: ```javascript function throttle(fn, limit) { let lastCall = 0; return function(...args) { const now = new Date().getTime(); if(now - lastCall >= limit){ lastCall = now; fn.apply(this, args); } }; } ``` 此版本利用当前时间和上次调用之间的时间差判断是否应该立即运行传入的方法;如果不是,则忽略此次请求直到满足条件为止[^3]。 --- ### 应用场景对比分析 | **特性/场景** | **防抖 Debounce** | **节流 Throttle** | |---------------------|----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | 输入框自动补全 | 用户停止打字后再发起查询 | 定期发送部分已键入的内容给服务器 | | 页面滚动监听 | 当用户结束滚屏动作后计算布局变化 | 每隔固定间隔检测视窗位置调整 | | 窗口尺寸改变处理 | 延迟到用户完全修改浏览器大小再更新界面 | 不断监控但减少不必要的重绘 | 以上表格总结了一些常见使用案例及其特点差异[^1][^2]. --- ### 实现细节探讨 对于更复杂的业务逻辑可能还需要考虑取消机制或者记忆最新参数等功能扩展。例如增强版`debounce`可以支持即时执行选项: ```javascript function advancedDebounce(func, delay, immediate=false){ var timeout; return function(){ var context = this, args = arguments; var later = ()=>{ timeout = null; if(!immediate){ func.apply(context,args);} }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later,delay); if(callNow)func.apply(context,args); }; }; ``` 而针对高性能需求下的`throttle`,也可以采用标志位代替时间戳来进行控制: ```javascript let isRunning = false; const throttledFunction = () => { if (!isRunning) { isRunning = true; console.log('Executing...'); setTimeout(() => { isRunning = false; }, 500); // Simulate work with a delay. } }; window.addEventListener('scroll', throttledFunction); ``` 这两种改进型方案提供了更大的灵活性以适应不同的实际项目环境要求[^3]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值