一、防抖:多次触发事件,事件处理函数只执行最后一次。
二、实现方式就是如果任务触发的频率比我们设定的时间要小,那么我们就清除掉上一个任务重新计时
| 【示例】防抖```javascript function debounce(fn, interval) { let timer = null return function() { // 如果用户在设定的时间内再次触发,就清除掉 clearTimeout(timer) timer = setTimeout(() => { fn.apply(this, arguments) }, interval); } }
|| --- || 【示例】防抖```javascript/*** 防抖函数 一个需要频繁触发的函数,在规定时间内,只让最后一次生效,前面的不生效* @param fn要被节流的函数* @param delay规定的时间*/function debounce(fn, delay) {//记录上一次的延时器var timer = null;return function () {//清除上一次的演示器clearTimeout(timer);//重新设置新的延时器timer = setTimeout(function(){//修正this指向问题fn.apply(this);}, delay);}}document.getElementById('btn').onclick = debounce(function () {console.log('按钮被点击了' + Date.now());}, 1000);
| | —- |
三、使用场景:
- 搜索框搜索输入,并在输入完后自动搜索
- 手机号,邮箱验证输入检测
- 窗口大小resize变化后,再重新渲染
四、无论是防抖还是节流,我们都可以使用下面的这种方式去验证一下
| 【示例】防抖验证:```javascript
window.onresize = debounce(function () { console.log(1) }, 1000) ``` | | —- |
五、防抖和节流我们都是借助 setTimeOut 来实现,不同的地方就是 清除定时器的位置
