防抖和节流

Posted 提灯戏江鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防抖和节流相关的知识,希望对你有一定的参考价值。

上一篇讲到惰性函数,这篇就做一个自己对节流和防抖的理解的整理。

其实节流和防抖也是使用惰性函数的原理的,赋一个初始值,然后第二次执行调用函数的跳过这个分支,如果不太清楚惰性函数的朋友可以去上一篇看一下。

我们先来讲节流

节流:就是指高频率触发事件的时候每隔一段时间只触发一次,

举个例子就是水龙头放水,我把水龙头阀门开大点,它很快速很持续的往下放水,但这样很浪费水资源,我想让它放慢点,频率低一点,然后我就把阀门开小一点,一滴水慢慢的积攒,等它到了一定的重量,才会自己掉下来。同样的,就类似于计算机内部的存储资源,我高频率的触发函数,很浪费计算机的资源,我想让他放慢一点,到达一定的时间才让他触发一次。

来个例子,我想要实现一个按钮点击之后控制台打印数据,但是我不想让他打印的那么快,我想让他一秒钟的间隔内无论如何点击都只能打印一次,下次打印的时候必须等两秒钟的时间到了才行

<body>
    <div>0</div>
    <button>点击</button>
    <script>
        var di = document.getElementsByTagName("div")[0]
        var btn = document.getElementsByTagName("button")[0]
        btn.onclick = thorttle(1000, test)

        function test()
            di.innerhtml = Number(di.innerHTML) + 1
            console.log(111)
       

        function thorttle(time, hanlder)
            // 时间(只执行一次)
            var timer = 0;
            // 返回fn给点击事件
            return function()
                // 拿到现在的时间
                var nowTime = new Date().getTime()
                    // 如果现在的时间与刚刚点击的时间间隔time秒
                if (nowTime - timer >= time)
                    // 那么就调用函数
                    hanlder()
                        // 然后把现在的时间赋值给刚刚的时间
                    timer = nowTime;
               
           
       
    </script>
</body>

可以看到这里面的var timer = 0;只执行了一次,下次点击的时候就调用返回的函数,然后上一次点击的时间跟现在点击的时间有没有经过一秒钟,如果有才可以打印一次,这个例子很简单,它只能大致的介绍一下节流的原理,但是不是很严谨,点击的时候这个程序还是执行了,我们只是没有让它打印而已。涉及到更高阶层的东西就很难用这个例子去解释。但是道理是相似的,其中的奥秘是相同的。

防抖;指高频率触发事件之后,在到达指定的时间之后,只执行最后一次,如果在指定时间之内又重新触发别的事件之后,那么指定时间发生改变,重新开始计时,直到到达了第二次重新计时的时间到达之后,执行最后一次。

举个例子:一个人用相机延迟拍照,三秒后开始给自己拍照,到了第二秒的时候,他女朋友突然来了,要跟他一起拍照片,然后他按下了暂停,重新开始摆pose凹造型,相机重新开始计时,新的三秒过后,相机开始拍照,拍下两个人最后一秒定格的动作。

来个案例:我想在输入框中不停的输入东西,等我停下来的时候,过一秒钟才在控制台打印出来输入框中的值,这个防抖经常用在某些浏览器的搜索框中,等你每一次输入完过了零点几秒钟才开始帮助你搜索

<body>
    <input type="text">
    <script>
        var int = document.getElementsByTagName("input")[0]
        int.oninput = dobounce(1000, test)

        function test()
            console.log(int.value)
       

        function dobounce(time, hanlder)
            // 初始值,永远只调用一次,这就是核心
            var timrs = null;
            // 返回fn给点击事件
            return function()
                clearTimeout(timrs)
                    // this对象赋给self变量
                var self = this;
                timrs = setTimeout(function()
                    hanlder()
                , time)
           
       
    </script>
</body>

防抖中也有惰性函数的影子,var timrs = null;只执行一次,然后返回新的函数给输入框,onipnut事件每一次键盘按下的时候都会触发,但是我们的输出结果仍然是符合要求的,原因就是因为用了防抖,每次按下键盘的时候都会触发,调用新函数,函数每次开始之前清楚一次定时器,时间一秒钟,一秒到了才开始打印输入框中现在存在的值,也就是最后的一次值。但是如果我第一次输入后,一秒钟还没到之前,我又重新输入,那么事件触发调用函数,立即清除上一次的定时器。重新开始计时,时间到了之后打印最后一次值。

以上是关于防抖和节流的主要内容,如果未能解决你的问题,请参考以下文章

JS的防抖和节流

防抖和节流啥区别,实现一个防抖和节流

ajax基础5--防抖和节流

Js中防抖和节流的区别,论如何避免重复点击

防抖和节流

JS防抖和节流