一、防抖
- 原理
短时间内多次触发同一事件,只执行最后一次,或者只执行最开始的一次,中间的不执行。缺点是,若短时间内频繁触发,会一直无法执行。
- 实现
(1)延迟执行function doSomething(){
console.log(document.body.scrollTop);
}
function debounce(_fn, _delay){
let timer = null;
return function(){
if(timer){
clearTimeout(timer);
timer = setTimeout(_fn, _delay);
}
else{
timer = setTimeout(_fn, _delay);
}
}
}
let myEventListener = debounce(doSomething, 200);
window.addEventListener('scroll', myEventListener);
(2)立即执行function doSomething(){
console.log(document.body.scrollTop);
}
function debounce(_fn, _delay){
let timer = null;
return function(){
let callNow = !timer;
if(timer) clearTimeout(timer);
timer = setTimeout(()=>{
timer = null;
}, _delay)
if(callNow) _fn();
}
}
let myEventListener = debounce(doSomething, 200);
window.addEventListener('scroll', myEventListener);
二、节流
- 实现
function doSomething(){
console.log(document.body.scrollTop);
}
function throttle(_fn, _delay){
let vaild = true;
return function(){
if(vaild){
_fn();
vaild = false;
setTimeout(()=>{
vaild = true;
}, _delay)
}
}
}
let myEventListener = throttle(doSomething, 200);
window.addEventListener('scroll', myEventListener);
浅谈js防抖和节流
防抖分立即执行与延时执行