防抖和节流
背景
如果频繁的调用一个事件,可能会影响浏览器或者服务器的性能。防抖和节流可以减少调用频率,减少对性能的影响
防抖
定义
对于在事件被触发n秒后再执行的回调,如果在这n秒的时间间隔内再触发事件,重新开始计时
类别
首次执行
当提交数据发送请求时,我们希望首次是不需要进行防抖的,直接发送请求,再次请求时再去进行防抖操作。
首次不执行
首次不需要进行防抖,如:检查输入的合法性时
应用场景
当输入框输入完之后n秒之后才进行搜索
代码
javascript
/*
* @param {function} fn - 需要防抖的函数
* @param {number} time - 多长时间执行一次(ms)
* @param {boolean} flag - 第一次是否执行
*/
function debounce(fn, time = 3000, flag = false) {
let timer;
return function (...args) {
// 在time时间段内重复执行,会清空之前的定时器,然后重新计时
timer && clearTimeout(timer);
if (flag && !timer) {
fn(...args)
}
timer = setTimeout(() => {
fn(...args)
}, time);
};
}节流
定义
执行多次事件,单位时间间隔内只执行一次
应用场景
下拉滚动加载
代码
javascript
/*
* @param {function} fn - 需要节流的函数
* @param {number} time - 多长时间执行一次(ms)
* @param {boolean} flag - 第一次是否执行
*/
function throttle(fn, time = 3000, flag = false) {
let timer;
return function (...args) {
// flag控制第一次是否立即执行
if (flag) {
fn(...args);
// 第一次执行完后,flag变为false;否则以后每次都会执行
flag = false;
}
if (!timer) {
timer = setTimeout(() => {
fn(...args);
// 每次执行完重置timer
timer = null;
}, time);
}
};
}助记
助记
- 防抖:假如电梯10s后会关门并运行,当10s期间再有人按下上下按键并进入时,则会再重新计时。在10s的时间间隔后才会运行
- 节流:不管有没有人进入,都是10s运行一次
@keyboarder-yang