本文参加了由公众号@若川视野发起的每周源码共读活动,点击了解详情一起参与。
这是源码共读的第25期,链接:juejin.cn/post/708744…。
防抖
防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。
比如设置 debounce 时间为3秒,如果触发时间间隔小于3秒,无论触发多少次回调,都只执行最后一次。
比如 00 秒触发,01 秒触发,03 秒触发,07 秒触发,总共触发了4次。00 - 01 间隔1秒,00 秒触发的函数不会执行;01 - 03 间隔2秒,01 秒触发的函数不会执行;03 - 07 间隔4秒,所以 03 触发的函数会在3秒后也就是 06 秒时执行;07 之后没有再触发,所以 07 触发的函数会在3秒后也就是 10 秒时执行。
思路分析:
-
需要防抖处理的函数
fn -
计时器,多次触发时要清除计时,并重新开始计时
function debunce(fn, ms = 50) {
let timer = null;
return function (...args) {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args)
}, ms);
}
}
function didClick() {
console.log('我被点了');
}
const btnClick = debunce(didClick, 1000, true);
<button onclick="btnClick()">点我</button>
有时候我们希望立刻执行函数,然后等到停止触发 n 秒后,才可以重新触发执行。
function debunce(fn, ms = 50, immediate = false) {
let timer = null;
return function (...args) {
if (timer) clearTimeout(timer);
// 立即执行
if (immediate) {
const t = !timer;
timer = setTimeout(() => {
timer = null;
}, ms);
if (t) fn.apply(this, args);
} else {
timer = setTimeout(() => {
fn.apply(this, args);
}, ms);
}
}
}
function didClick() {
console.log('我被点了');
}
const btnClick = debunce(didClick, 1000, true);
<button onclick="btnClick()">点我</button>