# 节流&防抖
# 节流
当一个事件被频繁触发的时候,每隔一段时间
,只会执行一次事件回调
。
通俗的讲就是节约流量,高频率的触发事件的时候,不需要每次触发都执行事件回调,我们每隔一段时间触发一次这个事件回调。
适用场景:
拖拽场景
:固定时间内只执行一次,防止高频的触发事件造成性能损耗。监听滚动事件
: 实现触底加载更多功能。屏幕尺寸变化时
,页面内容随之变动,执行相应的逻辑。
实现逻辑:
// 定时器实现
function throttle(fn, delay = 100) {
let timer = 0
return function () {
if (timer) return
let timer = setTimeout(() => {
fn.apply(this, arguments)
timer = 0
}, delay)
}
}
//时间戳实行
function throttle(fn, delay = 100) {
let lastCall = 0
return function () {
if (Date.now - lastCall < delay ) return
fn.apply(this, arguments)
lastCall = Date.now
}
}
# 防抖
当一个事件被频繁触发的时候,触发结束的一段时间后只执行一次事件回调;如果在这一段时间内事件再次被触发则重新计时
。
防止抖动,在一定时间内只执行一次。
在你坐电梯时,当一直有人进电梯(连续触发),电梯门不会关闭,在一定时间间隔内没有人进入(停止连续触发)才会关闭。
适用场景:
- 远程搜索框:防止用不断输入过程中不断请求资源。设置输入结束后内一段时间后只触发一次,用防抖来节约资源。
- 按钮提交,比如点赞,表单提交等,防止用户多次提交。
- 监听resize触发,不断调整浏览器窗口会一直触发resize,使用抖动可以让其只执行一次。
实现逻辑:
function debounce(fn, delay = 100) {
let timer = 0
return function() {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(this, arguments)
clearTimeout(timer)
}, delay)
}
}