防抖节流(闭包的实际运用)
防抖函数
当持续出发事件,一定时间没有再触发该事件,事件函数将执行一次
如果设定时间之前又触发了一次,则重新延时(定时器);类似王者荣耀回城,再次点击回城重新计时
1
2
3
4
5
6
7
8
9
10
11
12
13function debounce(func, wait) {
let timeout;
//利用闭包来延长timer 的声明周期和作用域
return function () {
let context = this; // 保存this指向
let args = arguments; // 拿到event对象
clearTimeout(timeout) // 清除上一次的函数
timeout = setTimeout(function(){ // 创建新的事件,并重新计时
func.apply(context, args)
}, wait);
}
}节流函数
当持续触发一个事件的时候,保证一段事件内,只调用一次事件处理;类似王者荣耀技能,只有当CD结束时才能再次释放
1
2
3
4
5
6
7
8
9
10
11
12function throttled2(fn, delay = 500) {
let timer = null
//利用闭包来延长timer 的声明周期和作用域
return function (...args) {
if (!timer) {
timer = setTimeout(() => {
fn.apply(this, args)
timer = null
}, delay);
}
}
}
相同点:
- 都可以通过使用
setTimeout
实现 - 目的都是,降低回调执行频率。节省资源
应用场景:
防抖:
- 搜索框搜索输入。只需用户最后一次输入完,再发送请求
- 手机号、邮箱验证输入检测
- 窗口大小
resize
。只需窗口调整完成后,计算窗口大小。防止重复渲染。
节流:
- 滚动加载,加载更多或滚到底部监听
- 搜索框,搜索联想功能