防抖与节流的介绍和封装实现
防抖
接口防抖和节流是网站性能优化方案的重要组成部分之一。简单来说,防抖是指在特定的时间内只执行一次函数,而节流是指在一个时间段内才执行一次函数。
在实现防抖之前,我们先来介绍一下什么是“防抖”。在前端开发中,“防抖”指的是在一定时间内只能触发一次事件,通常是输入框或滚动事件。假如没有防抖控制,页面会出现一些异常情况,例如:搜索框输入过快、滚动条跳动频繁等。
实现原理
防抖的实现原理非常简单,就是通过对要执行的函数进行延迟处理,以此来控制函数执行的次数。具体流程如下:
- 定义一个变量用于保存计时器。
- 在函数执行前判断计时器是否存在,如果存在则清除计时器。
- 为函数设置时间延迟,将返回结果保存到计时器变量中。
- 等待时间超过设定的阈值后,执行相应的回调函数。
下面是防抖代码的示例:
// 防抖
function debounce(fn, delay = 500) {
let timer = null;
return function(...args) {
if (timer !== null) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fn.apply(this, args);
timer = null;
}, delay);
};
}
注意事项
在使用防抖技术的时候,需要注意以下几点:
- 时间延迟需要根据业务需求进行调整。
- 在防抖过程中,要确保函数参数传递正确。
节流
相比于防抖技术,节流技术更加灵活。在前端开发中,“节流”通常指的是在一定时间内只能执行一次事件,例如:下拉加载更多、页面滚动等。
实现原理
节流技术的实现原理也非常简单,就是通过设置一个固定时间间隔,在这个时间间隔内只能执行一次相应的回调函数。具体流程如下:
- 定义一个变量用于保存上一次执行函数的时间。
- 在执行函数前获取当前的时间戳。
- 判断当前时间与上一次执行时间是否大于设定的间隔时间,如果大于,则执行相应的回调函数,并更新上一次执行时间。
- 如果小于设定的间隔时间,则等待下一次执行。
下面是节流代码的示例:
// 节流
function throttle(fn, delay = 500) {
let last = 0;
return function(...args) {
let now = new Date().getTime();
if (now - last > delay) {
last = now;
fn.apply(this, args);
}
};
}
注意事项
在使用节流技术的时候,需要注意以下几点:
- 时间间隔需要根据业务需求进行调整。
- 在节流过程中,要确保函数参数传递正确。
- 节流过程中可能会出现滞后或者丢失部分事件的问题,需要进行相应的处理。