节流和防抖(详细)

111 阅读1分钟

💁🏼‍♀ 什么是防抖?

--高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间
防抖类似于英雄联盟回城6秒,如果回城中被打断,再次回城需要再等6秒

具体流程实现如下:

image.png

具体代码实现如下:

<body>
    <input type="text" id="inp">
    <script>
    let inp  = document.getElementById('inp');

    //封装一个防抖函数
    function debounce(fn,time){
        //利用闭包实现记录timeout,用来记录清除的定时器编号
        let timeout = null;
        return function(){
            // 如果不是最后一次就清除定时器
            if(timeout!=null){
                //清除setTime定时器
                clearTimeout(timeout);
            }
            //timeout会接收到等待过程的值,当执行了fn()后timeou就会失效
            timeout = setTimeout(()=>{
                fn.call(this);//this指向改变为调用函数的this
                //将timout设为空,当执行完定时器后就不用再清除定时器了
                timeout = null;
            },time)
        }
    }

    function getvalue(){
        //输出输入框的值
         console.log(this.value);
    }
    inp.addEventListener('input',debounce(getvalue,2000));
    
    </script>
</body>

💁🏼‍♀ 什么是节流?

--高频率触发的事件,在指定的单位时间内,只响应第一次
节流类似于英雄联盟里的英雄平A   一定是内点击多次只进行攻击一次

具体流程实现如下:

image.png

具体代码实现如下:

function throttle(fn,time){
            //闭包记录第一次是成功的
            let flag = false
            return function(){
                //标记为真时return
                if(flag) return;
                else{
                    //再次点击后就return不会再进入计时器内
                    flag = true;
                    setTimeout(()=>{
                        fn.call(this);
                        // 直至计时器执行结束,方可再次触发事件
                        flag = false;
                    },time);
                }
            }
        }

        function getvalue(){
            console.log("click the btn...");
        }

        var btn = document.getElementById('btn');
        btn.addEventListener('click',throttle(getvalue,2000));