如果可以实现记得点赞分享,谢谢老铁~
js防抖和节流实现
- 防抖(debounce):触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间
- 举例:就好像在百度搜索时,每次输入之后都有联想词弹出,这个控制联想词的方法就不可能是输入框内容一改变就触发的,他一定是当你结束输入一段时间之后才会触发。
- 节流(throttle):高频事件触发,但在 n 秒内只会执行一次,所以节流会稀释函数的执行频率
- 举例:预定一个函数只有在大于等于执行周期时才执行,周期内调用不执行。就好像你在淘宝抢购某一件限量热卖商品时,你不断点刷新点购买,可是总有一段时间你点上是没有效果,这里就用到了节流,就是怕点的太快导致系统出现bug。
应用场景:提交表单、高频监听事件
/**
**@param{fn: function} 需要防抖执行的函数
**@param{delay: number} 延迟时间
*/
export const debounce = (fn: any, delay = 500) => {
// 存储定时器的timerId
let timer: any = null;
return function (args: any) {
// 在每一次调用函数时,都清除上一次的定时器
if (timer) clearTimeout(timer);
// 开启一个定时器
timer = setTimeout(() => {
fn(args);
}, delay);
};
};
/**
* @description: 节流,立即执行方法,之后触发周期不超过 wait 不执行
*/
function throttle(fn, wait = 300) {
let timer = null
return function () {
const context = this
if (!timer) {
timer = setTimeout(() => {
timer = null
}, wait)
fn.apply(context, arguments)
}
}
}