函数防抖和函数节流的区别

已被阅读 943 次 | 文章分类:javascript | 2021-02-14 14:46

简单说 这两种方式都可以提升前端性能,防止事件崩溃掉的方式;应用场景比如你绑定了滚动事件,那么如果不断滚动鼠标,重复的事件会一直执行;很容易浪费浏览器内存和性能,以至于浏览器崩溃;比如针对地图应用的话;如果在鼠标缩放地图时绑定了请求不同资源的事件,来回缩放鼠标,地图应用大概率会反映迟钝甚至挂掉;下面是如何通过延时函数 实现防抖和节流

一 函数防抖(debounce)

函数防抖的原理是每次执行前,清除上一个定时器;也就是在延时时间没到之前,如果再次触发交互,就会从此刻重新开始计时; 例如点击事件,延时1000ms执行用户相应;如果在延时内用户再次点击,那么清除前一个1000ms,从0重新开始计数,如果1000ms内 用户没有再触发交互,那么就执行点击的主体内容;

                                            
var timeout = null;      //定义一个定时器
function debounce(){
    clearTimeout(timeout);  //清除这个定时器
    timeout = setTimeout(()=>{
        console.log(Math.random()); 
    }, 1000);  
}
                                            
                                        

全部代码如下

                                            
<!doctype HTML>
<html>
    <head>
        <meta charset="utf-8"></meta>
        <style>
            #main{
                width: 200px;
                height:200px;
                overflow:auto;
                border: 2px solid;
            }
        </style>
    </head>
    <body>
        <div id="main">
            
        </div>
       
        <script>
               var timeout = null;      //定义一个定时器
            function debounce(){
                clearTimeout(timeout);  //清除这个定时器
                timeout = setTimeout(()=>{
                    console.log(Math.random()); 
                }, 1000);  
            }
             // 点击事件
             let num=0;
             document.getElementById('main').addEventListener('click', ()=>{
                document.getElementById('main').innerHTML= num++;
                debounce()
            });
        </script>
    </body>
</html>
                                            
                                        

/net/upload/image/20210214/09b1a57d-0142-401e-9c2a-ee37f23ab8eb.gif

从中可以看出,点击div后1s会执行函数内容;但是如果一直点击,可能函数主体永远不会执行;因为定时器会被不断清空。

二 函数节流(throttle)

函数节流是在固定时间内只执行一次,而且肯定会执行一次; 例如1s内无论点多少次,都会按时执行一次;

                                            
var timer=null, isFinshed=true;
function throttle(){
  if (isFinshed === true) {
      isFinshed = false;
      timer = setTimeout(() => {
          console.log('鼠标单击');
          isFinshed = true;
      },1000);
  }
}
                                            
                                        

全部代码及演示效果如下

                                            
<!doctype HTML>
<html>
    <head>
        <meta charset="utf-8"></meta>
        <style>
            #main{
                width: 200px;
                height:200px;
                overflow:auto;
                border: 2px solid;
            }
        </style>
    </head>
    <body>
        <div id="main">
            
        </div>
       
        <script>
            var timer=null, isFinshed=true;
            function throttle(){
                if (isFinshed === true) {
                    isFinshed = false;
                    timer = setTimeout(() => {
                        console.log('鼠标单击');
                        isFinshed = true;
                    },1000);
                }
            }
             // 点击事件
             let num=0;
             document.getElementById('main').addEventListener('click', ()=>{
                document.getElementById('main').innerHTML= num++;
                throttle()
            });
        </script>
    </body>
</html>
                                            
                                        

/net/upload/image/20210214/9256b54c-6f22-4c0c-bf70-50c61c1eeb12.gif

QQ:3410192267 | 技术支持 微信:popstarqqsmall

Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号