函数的节流和防抖

一、 函数防抖和节流的概念 

        函数防抖和节流是优化高频率执行js代码的一种手段,js中的一些事件如浏览器的resize、scroll,鼠标的mousemove、mouseover,input输入框的keypress等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能。为了优化体验,需要对这类事件进行调用次数的限制。

        即:限制函数的执行次数

        防抖:通过setTimeOut的方式,在一定的时间间隔内,将多次触发变为一次触发。(只执行最后一次)

        节流:减少一段时间的触发频率。(控制执行次数)

二、  函数防抖

        在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

    <input type="text" id="test"/>
     <script>
        let inp = document.getElementById('test');
        let t = null;
        inp.oninput = function(){
             if(t!=null){
                 clearInterval(t)
             }
             t = setTimeout(()=>{
                 console.log(this.value)
            },500)      
        }
    </script>

        对函数进行封装,封装后:

    <input type="text" id="test"/>
    <script>
        let inp = document.getElementById('test');
        inp.oninput = debounce(function(){
            console.log(this.value)
        },500)
        function debounce(fn,delay){
            let t = null;
            return function(){
                if(t!=null){
                   clearInterval(t)
                }
                t = setTimeout(()=>{
                    // console.log(this)
                    // 使用call改变fn函数this指向
                    fn.call(this)
                },delay)   
            }
        }
    </script>

三、函数节流

        每隔一段时间,只执行一次函数。

    <body style="height: 2000px;"></body>
    <script>
        let flag = true;
        window.onscroll= function(){
            if(flag){
                setTimeout(()=>{
                    console.log('@')
                    flag = true
                },500)  
            }
            flag=false
        }
    </script>

         对函数进行封装,封装后:

    <body style="height: 2000px;"></body>
    <script>
        window.onscroll= throttle(function(){
            console.log('@')
        },500)
        function throttle(fn,delay){
            let flag = true;
            return function(){
                if(flag){
                    setTimeout(()=>{
                        fn.call(this)
                        flag = true
                   },delay)  
                }
                flag = false
            }
        }
    </script>

四、函数防抖与节流的比较

1. 相同点:

        都可以通过使用 setTimeout 实现。

        目的都是,降低回调执行频率,节省计算资源。

2. 不同点:

        函数防抖,在一段连续操作结束后,处理回调,关注一定时间连续触发的事件只在最后执行一次

        函数节流,在一段连续操作中,每一段时间只执行一次,侧重于一段时间内只执行一次

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值