简单版的防抖和节流

防抖和节流是解决频繁触发导致的性能问题,确保操作流畅。防抖是事件触发后n秒内未再次触发才执行,否则重置计时。节流则是n秒内仅执行一次,多次触发也只执行首次。
摘要由CSDN通过智能技术生成

  防抖和节流都是为了解决响应速度更不上触发频率,而出现的卡死,不流畅问题。

  防抖:事件在触发n秒后会执行,如果n秒内事件再次被触发则重新计时

//fn要进行防抖的函数
function debounce(fn,delay){
    let timeout = null,                    //设置定时器标识存放定时器

    return function(){                     //闭包保存定时器
        if(timeout)clearTimeout(timeout)       //规定时间内如果事件再次被触发,清除上一个定时器

        timeout = setTimeout(function(){         //注意:得用普通函数,箭头函数不行
            fn.apply(this,arguments)        
            timeout = null
        },delay)
    }
}

//函数调用
window.addEventListener('scroll',debounce(function(){
    console.log('1111')
},500))

  实现:n秒内如果事件被再次调用,清除上一次的定时器,重新打开新定时器,因为要执行的函数被放在定时器中,清除了定时器函数就不会再执行了。

  节流:事件在n秒内只会被触发一次,如果多次触发,也只有第一次触发有效

function throttle(fn,delay){
    let canRun = true                //设置变量控制节流

    return function(){
        if(!canRun) return           //若之前有定时器就直接return,只有第一次触发时可以执行到下面程序,后面的都会被return掉

        canRun = false

        setTimeout(function(){

            fn.apply(this,arguments)
            canRun = true            //执行完函数后又把canRun置为ture,又能开始新的节流操作了

        },delay)
    }
}
            

实现:利用变量canRun控制程序能否进行到定时器那一步,如果之前有函数执行到,就立即把后面的函数return掉,不给它们开启定时器执行函数的机会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值