js 防抖与节流

节流

解释:

当用户一直通过某个事件触发某一个函数时,由于设置了节流,这个函数会每隔一段时间执行一次

原理:

当给一个函数绑定节流时,实际上是开启了设置了一个定时器timer,初始值为null,当用户第一次触发这个事件时,由于定时器初始值为null,那么就会创建一个定时器,等过了一定的时间间隔后就会执行这个函数,如果还没有达到时间间隔再次触发了事件,则此次函数不执行,直到达到了时间间隔,将定时器设置为null,等下一次触发事件时,判断定时器为null,则会开启定时器,重复此步骤,实现函数节流

时间戳写法:

function throttle(fn,delay){
        // 初次绑定时就设置一个初始值
        let pre = 0
        return function(...args){
            var now = Date.now()
            // 首次肯定可以执行事件,执行完事件就更改pre的值,方便下一次判断
            if(now-pre>delay)
            {
                fn.apply(this,args)
                pre = now
            }
        }
    }

定时器写法:

    function throttle(fn,delay){
        // 初次绑定时就设置了timer定时器,初始值为null
        let timer = null
        return function(...args){
            // 首次执行这个函数时,timer为null,进入if,执行函数
            if(!timer)
            {
                timer = setTimeout(() => {
                    // 这里的this指向和参数都要与前面的事件触发的函数一致
                    fn.apply(this,args)
                    console.log(this);
                    // 当定时器执行完之后将timer设置为null,方便下次函数的执行
                    timer = null
                }, delay);
            }
        }
    }

防抖

解释:

如果用户操作的时间间隔一直小于设置防抖的时间间隔,则只会执行一次

时间戳写法:

function debounce(fn,delay)
    {
        let pre=0
        return function(...args){
            var now = Date.now()
            if(now-pre>delay)
            {
                fn.apply(this,args)
                pre = now
            }
            pre = now
        }
    }

定时器写法:

    function debounce(fn,delay)
    {
        let timer = null
        return function(...args){
            clearInterval(timer)
            timer = setTimeout(() => {
                fn.apply(this,args)
            }, delay);
        }
    }
    document.querySelector('#test').onclick = throttle(add,1000)

时间戳与定时器的区别:时间戳写法,每次用户第一次执行这次事件时马上就执行,而定时器写法由于设置了定时器的时间,会等过了这个时间后再执行第一次的事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值