防抖
规则
- 防抖是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则计时清零,重新计时;
- 多次触发,只执行最后一次,如等电梯时,只要有一个人进来就需要再等n秒电梯才能关;
使用场景
- 高频率触发的事件,如频繁点击按钮会发送过多的请求,使用防抖只让规定时间内最后一次触发的事件执行;
- 浏览器行为,如
scroll/resize
, 频繁触发会造成计算过多;
- 编辑行为的实时保存, 在无任何操作一定时间后,进行保存;
函数封装
function debounce(fn, delay) {
let timer
return function(...args) {
if(timer) {
clearTimeout(timer)
}
timer = setTimeout(() =>{
fn.apply(this,args)
}, delay)
}
}
函数使用
function task() {
}
debounce(task, 1000)
节流
规则
- 节流可以控制事件发生的频率,如控制1秒发生一次;
- 就像红绿灯,每等一段特定的时间就可以过一批;
- 节流类型分为时间戳版和定时器版本,时间戳版本函数的触发是在时间段开始的时候,然后下一次函数的触发是在下一段时间段开始时;定时器版本函数的触发是在上一段时间段结束的时候,下一次函数的触发是在这一次时间段结束的时候;
使用场景
- 高频率触发的事件
(resize/scroll)
,在一段时间内只触发一次;
- 鼠标触发的事件(如点击事件)单位时间内只触发一次;
- 每个时间间隔计算一次进度,如滚动事件是否滚动到底部自动加载更多;
函数封装
function throttle(fn, delay, type) {
if(type === 1) let previous = 0
if(type === 2) let timeout
let delay = delay || 0
return function () {
let self = this
let args = arguments
if(type === 1) {
let now = Date.now()
if(now - previous > delay) {
previous = now
fn.apply(self, args)
}
}else if(type === 2){
if(!timeout) {
timeout = setTimeout(() => {
timeout = null
fn.apply(self, args)
}, delay)
}
}
}
}
函数使用
function task() {
}
debounce(task, 1000, 1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本