一、防抖:在规定的时间第n秒后才会执行回调,如果在n秒内又被触发,则会进行重置(重新计时);
应用场景:
- 登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖;
- 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖
- 文本编辑器实时保存,当无任何更改操作一秒后进行保存
//封装防抖函数
function debounce(fn, delay = 1000) {
// 定义一个变量
let timer = null;
//返回一个新函数,就是在调用这个函数
return function () {
//清除上一个定时器
clearTimeout(timer)
//创建一个新的定时器
timer = setTimeout(() => {
// 调用fn
fn.call(this)
}, delay)
}
}
举个栗子:
二、节流:规定在一定的时间内,只能触发一次函数。如果在规定时间内触发多次函数,只有一次生效。
应用场景:
1.监听滚动事件,下拉加载更多事件;
//封装节流函数
function throttle(fn,delay=1000) {
// 定义一个flag
let flag = true;
return function () {
//第一次进来不会执行:flag为false直接return
if (!flag) return;
//第一次点击把flag赋值为false,继续向下执行
flag = false;
// 创建一个定时器
setTimeout(() => {
fn.call(this)
// 执行回调后,把flag重置为true;
flag = true;
}, delay)
}
}
举个栗子:
👁🗨总结:函数节流是不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
防抖和节流还可以通过引入第三方库lodash来实现
bootcdn引入lodash
防抖:
<script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.core.js"></script>
//以上防抖代码可写成如下:
inp.addEventListener('input', _.debounce(function () {
console.log(inp.value)
}, 1200))
节流:
<script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.core.js"></script>
//以上防抖代码可写成如下:
inp.addEventListener('click', _.throttle(function () {
console.log('抢购')
}, 1200))