防抖和节流 防抖(debounce) 防抖,顾名思义,防止抖动,以免把一次事件误认为多次,敲键盘就是一个每天都会接触到的防抖操作。
想要了解一个概念,必先了解概念所应用的场景。在 JS 这个世界中,有哪些防抖的场景呢
登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖
调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖
文本编辑器实时保存,当无任何更改操作一秒后进行保存
防抖重在清零clearTimeout(timer)
,触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function debounce (fn, wait ) { let timer; return function ( ) { let _this = this ; let args = arguments ; if (timer) { clearTimeout (timer); } timer = setTimeout (function ( ) { fn.apply (_this, args); }, wait); }; } window .onresize = debounce (function ( ) { console .log ("resize" ); }, 500 );
节流(throttle) 节流,顾名思义,控制水的流量。控制事件发生的频率,如控制为 1s 发生一次,甚至 1 分钟发生一次。与服务端(server)及网关(gateway)控制的限流 (Rate Limit) 类似。
scroll
事件,每隔一秒计算一次位置信息等
浏览器播放事件,每个一秒计算一次进度信息等
input 框实时搜索并发送请求展示下拉列表,每隔一秒发送一次请求 (也可做防抖)
节流重在加锁 timer=timeout
,高频事件触发,但在 n 秒内只会执行一次,所以节流会稀释函数的执行频率
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function throttle1 (fn, wait ) { let time = 0 ; return function ( ) { let _this = this ; let args = arguments ; let now = Date .now (); if (now - time > wait) { fn.apply (_this, args); time = now; } }; } function thorttle2 (fn, wait ) { let timer; return function ( ) { let _this = this ; let args = arguments ; if (!timer) { timer = setTimeout (function ( ) { timer = null ; fn.apply (_this, args); }, wait); } }; }