防抖和节流
什么是防抖,什么是节流
节流:n秒内运行一次,若在n秒内重复触发,只运行一次
防抖: n秒后执行该事件,若在n秒内重复触发,则重新记时
节流代码实现
js
function throttled(fn, delay) {
let oldTime = Date.now()
return function (...args) {
let newTime = Date.now()
if(newTime - oldTime > delay) {
fn.apply(null, args)
oldTime = Date.now()
}
}
}防抖代码实现
js
function debounce(func, wait) {
let timeout
return function() {
let context = this
let args = arguments
clearTimeout(timeout)
timeout = setTimeout(()=> {
func.apply(context, args)
}, wait)
}
}区别
相同点:
- 都可以使用setTimeout实现
- 目的都是降低回调执行频率,节省资源
不同点:
- 函数防抖,在一段连续操作结束后,处理回调,利用clearTimeout和 setTimeout实现。函数节流,在一段连续操作中,每一段时间只执行一次,频率较高的事件中使用来提高性能
- 函数防抖关注一定时间连续触发的事件,只在最后执行一次,而函数节流一段时间内只执行一次
应用场景
节流:
- 滚动加载,加载更多或者滚动到底部监听
- 搜索框,搜索联想功能
防抖:
- 搜索框,用户一次性输入完,再发送请求
- 手机号、邮箱验证输入检测
- 窗口大小resize。防止重复渲染
如何保证防抖函数无论怎样最后都会执行一次
答案:在防抖函数中加入节流函数