防抖与节流

防抖:function debounce(callback,delay)

重新计时。从某次操作(callback被触发)开始计时,若在设置时间(delay)内再次触发操作,则重新开始计时;若在设置时间内未再次触发,则在本次计时结束时执行回调函数callback。

function debounce(callback,delay){
	let timeout=null
    return ()=>{
        //如果delay时间内重新触发,则清空定时器,重新计时
        if(timeout) clearTimeout(timeout)
        //隔delay时间执行callback
        timeout=setTimeout(()=>{
            callback
        },delay)
    }
}

节流:function throttle(callback,delay)

在指定时间内只执行一次。在delay时间段内,不管callback被触发多少次,只算作一次。

function throttle(callback,delay){
    let timer=null
    return ()=>{
        //如果计时器为空,则可以被触发
        if(!timer){
            //触发时,给计时器赋值,使其不可再被触发
            timer=setTimeout(()=>{
                //在delay时间段内执行一次callback,执行完成后,timer置为空,以便下一次被触发
                callback
                timer=null
            },delay)
        }
    }
}

附小实例的完整代码

<html>
    <body>
        <div>
            <input type="text">
            <div style="width:100px;height: 100px;background-color: pink;" id="div1"></div>
        </div>
    </body>
    <script>
        let input=document.querySelector('input')
        let div=document.getElementById('div1')

        function fn(e){
            ((e.target.value)&&console.log(e.target.value))||console.log('节流',e.target)
        }

        // setTimeout(callback,after,args1,args2)
        /*
            setTimeout的callback函数不能带参数,解决方式:
            用匿名函数包裹,在如下代码中用箭头函数包裹了callback
        */

        // 防抖
        function debounce(fun,delay){
            let timeout=null
            return (args)=>{
                if(timeout) clearTimeout(timeout)
                timeout=setTimeout(()=>{
                    fun(args)
                },delay)
            }
        }
        // 节流
        function throttle(fun,delay){
            let timer=null
            return (args)=>{
                if(!timer){
                    timer=setTimeout(()=>{
                        fun(args)
                        timer=null
                    },delay)
                }
            }
            
        }

        let deb=debounce(fn,1000)
        input.addEventListener('input',e=>{
            deb(e)
        })
        let thro=throttle(fn,1000)
        // 鼠标移动时打印“节流”
        div.addEventListener('mousemove',(e)=>{
            thro(e)
        })
        
    </script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值