javascript实现防抖与节流

94 阅读1分钟

防抖(debounce)

防抖的作用是:当用户多次触发回调函数时,只触发最后一次操作的,其余的全部忽略掉; 在第一次触发事件时,不立即执行函数,而是给出一个期限值比如200ms。

  • 如果在200ms内没有再次触发滚动事件,那么就执行函数
  • 如果在200ms内再次触发滚动事件,那么当前的计时取消,重新开始计时

效果:如果短时间内大量触发同一事件,只会执行一次函数。从而可以通过闭包内检查定时器状态、清空定时器来实现重新计时。

function debounce(fn,delay){
    let timer = null //借助闭包    
    return function() {        
        if(timer){           
            clearTimeout(timer)         
        }        
        timer = setTimeOut(fn,delay)     
    }} 
    
function showTop  () {
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;  
    console.log('滚动条位置:' + scrollTop);
}
window.onscroll = debounce(showTop,1000)

节流(throttle)

但是如果产品同学的期望处理方案是:即使用户不断拖动滚动条,也能在每个时间间隔之中执行一次函数呢?其实很简单:我们可以在闭包中设置一个控制阀门,也就是让函数执行时,在某个时间段内暂时失效,过了这段时间后再重新激活。而如果执行完一次整个函数,再去关闭整个阀门。通过这两个时间节点来控制阀门。

function throttle(fn,delay){
    let executing = false //借助闭包    
    return function() {        
        if(executing) return;   
        setTimeout(()=>{
            fn();
            executing = false;
        },1000);
        executing = true;
    }} 
    
function showTop  () {
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;  
    console.log('滚动条位置:' + scrollTop);
}
window.onscroll = throttle(showTop,1000)

更多精彩文章敬请关注: