js的防抖

 

                    debounce(fn,wait){
                        let timer;
                        return function () {
                            clearTimeout(timer);
                            timer = setTimeout(() => {
                                fn.apply(this, arguments)   // 把参数传进去
                            }, wait);
                        }
                    },

                    debounce(()=>{console.log(1111),500})

vue 项目中可用

页面
<input placeholder="输入对方邮箱地址" type="text" @input="print($event.target.value)" v-model="findText"/>                    

                    //data
                    timeout:null,
                    findText:''

                    //methods
                    print(e){
                        this.findText = e
                        if(this.timeout){
                            clearTimeout(this.timeout)
                        }
                        this.timeout = setTimeout(() => {
                            console.log(e)
                        }, 500);
                    },

### JavaScript防抖函数的实现与使用 #### 防抖函数的概念 防抖是一种优化技术,用于限制某个操作在一定时间内只被触发一次。它常用于提升前端应用性能,尤其是在频繁触发事件的情况下(如窗口调整大小、滚动或键盘输入)。通过延迟执行回调函数并忽略短时间内多次触发的操作,可以有效减少不必要的计算开销。 --- #### 防抖函数的核心原理 防抖函数利用`setTimeout`定时器来控制回调函数的执行时机。当事件首次触发时启动一个延时计时器,在设定的时间间隔内再次触发该事件,则清空前一个计时器并重新设置新的计时器。只有当最后一次触发之后经过指定时间无新触发时,才会最终执行目标函数[^1]。 --- #### 简单的防抖函数实现 以下是基于闭包的一个简单防抖函数实现: ```javascript function debounce(func, delay) { let timeoutId; return function (...args) { clearTimeout(timeoutId); timeoutId = setTimeout(() => func.apply(this, args), delay); }; } ``` 此版本适用于大多数基本场景,其中`func`为目标函数,`delay`为等待毫秒数。每次调用返回的新函数都会清除旧的定时器,并设置一个新的定时器以推迟实际执行[^2]。 --- #### 改进版:支持立即执行选项 有时可能需要配置是否允许第一次触发即刻生效而非等到延迟结束才运行。为此可以在原基础上增加参数控制这一行为: ```javascript function debounce(callback, delay, immediately) { let timer = null; return function (...args) { const context = this; if (timer) clearTimeout(timer); if (immediately && !timer) { callback.apply(context, args); } timer = setTimeout(function () { if (!immediately) { callback.apply(context, args); } timer = null; }, delay); }; } ``` 在此改进型定义里新增了一个布尔类型的第三个参数`immediately`决定初次调用是否会立刻响应而不是仅限于超时期满后才动作[^3]。 --- #### 实际应用场景举例——监听输入框变化 假设有一个搜索功能需求,每当用户停止打字超过一秒后再发起请求获取数据列表更新界面显示内容。此时可借助上述封装好的带“即时模式”的去抖动机制完成如下代码片段编写工作: ```html <input type="text" id="searchInput"> <ul id="resultList"></ul> <script> // 模拟异步接口查询过程 async function fetchData(keyword){ console.log(`Fetching data for "${keyword}"...`); await new Promise(resolve=>setTimeout(resolve,500)); document.getElementById('resultList').innerHTML += `<li>${keyword}</li>`; }; // 创建带有防抖效果的处理器实例 var handleSearchRequest = debounce(fetchData.bind(null),800,true); // 绑定至HTML元素上的keyup事件处理程序链路之中 document.querySelector("#searchInput").addEventListener("keyup",event=>{ handleSearchRequest(event.target.value.trim()); }); </script> ``` 这里我们将自定义的数据抓取逻辑作为第一个实参传递给了`debounce()`工厂方法;第二个形参设定了两秒钟缓冲期长度;最后一个标志位开启提前反馈特性以便改善用户体验流畅度感知水平[^4]。 --- #### 性能优势分析 采用防抖策略相比传统方式有明显的优势体现在以下几个方面: - **降低服务器负载压力**:减少了因高频次交互产生的多余网络请求次数; - **增强UI渲染效率**:避免了由于密集刷新引起卡顿现象的发生概率; - **简化业务流程管理难度**:集中关注核心算法设计部分而无需过多考虑边界条件校验等问题[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值