防抖和节流
防抖(debounce)
原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计算时间。(最后一次优先)
例子:如果有人进电梯,那电梯将在10秒钟后出发,这时如果又有人进电梯了,我们又得等10秒再出发。
思路:通过闭包维护一个变量,此变量代表是否已经开始计时,如果已经开始计时则清空之前的计时器,重新开始计时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | funtion debounce( fn, time ) { // 使用闭包来保存变量 let timeout; return function () { if (!timeout) { // 如果持续存在,就清掉前面的定时器。 clearTimeOut(timeout); return ; } timeout = setTimeout(fn, time) } } // 处理函数 function handle() { console.log(123) } //添加监听事件 window.addEventListener( 'reseize' , debounce(handle, 500)); |
节流(throttle)
原理:规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。(一次优先)
例子:游戏内的技能冷却,无论你按多少次,技能只能在冷却好了之后才能再次触发
思路:通过闭包维护一个变量,此变量代表是否允许执行函数,如果允许则执行函数并且把该变量修改为不允许,并使用定时器在规定时间后恢复该变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 | function throttle ( fn, time ) { var timer = null ; return function () { var _this = this ; var args = arguments; if (!timer) { timer = setTimeout( function () { fn.apply(_this, args); timer = null ; }, time) } } } |
函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的原理却不一样。
函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。
使用场景
debounce
1.search搜索联想,用户在不断输入值时,用防抖来节约请求资源。
2.window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次。
throttle
1.鼠标不断点击触发,mousedown(单位时间内只触发一次)。
2.监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!