节流和防抖
节流:控制一段时间内触发的次数,减少一段时间的触发频率
使用场景: 1. scroll 事件, 每隔一段时间计算位置信息 2. input 框实时搜索并发送请求,每隔一段时间发送一次请求
js
const throttle = (() => {
// 设置上一次触发时间
let last = 0;
return (callback, time) => {
// 获取当前时间戳
let now = +new Date();
// 当前时间减去上一次触发时间大于规定的延时时间,触发时间
if (now - last > time) {
callback();
// 重置上一次执行时间
last = now;
}
}
})();
防抖:借助setTimeout定时器,在一定的间隔时间内,将多次触发变为一次触发
使用场景: 1. 登录、发送短信等按钮避免用户点击太快,以致于发送多次请求,需要防抖 2. 调整浏览器窗口大小,resize 次数过于频繁,造成计算次数过多 3. 搜索框搜索输入,不需要每输入一个字就进行搜索,等待一段时间没有再次输入就返回结果
js
const debounce = (() => {
// 设置一个空定时器
let timer = null;
return (callback, time) => {
// 判断是否存在定时器,存在则清空定时器
timer && clearTimeout(timer);
timer = setTimeout(callback, time);
}
})(); // 自调用,return