前言
在 JavaScript 开发中,函数防抖是一种常用的技术,它可以有效地限制函数的执行频率,避免在频繁触发的情况下浪费资源。本文将介绍函数防抖的概念、原理以及如何实现与应用。
1 介绍函数防抖的概念和作用
在 JavaScript 中,函数防抖的概念是指通过延迟函数的执行,在一段时间内只执行一次函数。函数防抖主要用于解决频繁触发的事件,如窗口调整、搜索框输入等。它可以有效地减少函数执行的次数,减轻浏览器负担,提升用户体验。
2 函数防抖的原理
防抖的核心就是利用定时器 (setTimeout) 来实现,对应的方法延迟执行,如果该方法在延迟时间以内,又再次触发,将上一次的执行函数清除
举个栗子:王者荣耀回城,只要被打断就需要重新来
3 在项目中对防抖进行封装使用
/**
* @param {Function} func
* @param {number} wait
* @param {boolean} immediate
* @return {*}
*/
export function debounce(func, wait, immediate) {
let timeout, args, context, timestamp, result;
const later = function() {
// 据上一次触发时间间隔
const last = +new Date() - timestamp;
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args);
if (!timeout) context = args = null;
}
}
};
return function(...args) {
context = this;
timestamp = +new Date();
const callNow = immediate && !timeout;
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
}
这段代码定义了一个 debounce
函数,用于函数防抖。
该函数的功能是将传入的函数进行防抖处理,避免频繁触发。在设定的时间间隔内,如果函数被多次触发,则会重新计时,直到超过设定的时间间隔后才执行最后一次触发的函数。如果设置 immediate
为 true
,则在首次触发时立即执行函数。