一、防抖
防抖:是指一段时间内,没有再触发事件,就执行这个事件;如果一段时间内又触发了这个时间,则清空已经间隔的时间,重新开始计时,等待事件触发。
场景:搜索框输入关键字,实时请求后台获取结果。
function debounce(fn, delay) {
let timer = null; // 用到了闭包
return (val) => {
let args = val;
if(timer) {
clearTimeout(timer);
}
timer = setTimeout( () => {
fn(args);
}, delay)
}
}
function con(value) {
console.log(value);
}
let debounceFunc = debounce(con, 500);
let input = document.getElementById('input');
input.addEventListener('keyup', function() {
debounceFunc(1);
})
二、节流
节流:当连续触发某个事件时,运用节流可以保证在一段时间内,只触发一次事件。
场景:监听滚动事件,做相应操作,比如:懒加载。
function throttle(fn, delay) {
// 利用闭包声明上次操作的时间变量,存放延时器的timer变量
let last = 0, timer = null;
// 将执行结果以函数的形式return出去
return (value) => {
// 定义当次操作的时间点
let now = +new Date();
let args = value;
// 如果这次与上一次的时间间隔大于规定的时间长,则执行
if(now - last > delay) {
last = now;
fn(args);
} else {
// 如果这里不写else的话,那么最后在小于时间间隔内连续触发,则不会执行;因此在这里用防抖的方法,加个延时器,延迟一段时间后执行
clearTimeout(timer);
timer = setTimeout(() => {
last = now;
fn(args);
console.dir(timer);
}, delay)
}
}
}
function fn(value) {
console.log(value);
}
let throttleFunc = throttle(fn, 500);
let input = document.getElementById('input');
input.addEventListener('keyup', function(e) {
throttleFunc(e.target.value);
})