js函数防抖与节流的实现

一、什么是函数的防抖

 概念:函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间。

    例子:坐公交车的时候,如果司机看到有人上车之后,就会多等待 5分钟,此时如果又有人进来(5分钟之内重复有人上车),那么公交司机就会以最后那个人为基础继续等待5分钟。所以,“函数的防抖”的关键在于,在 一个事件 发生 一定时间 之后,才执行 特定动作。

二、为什么需要函数防抖

  在前端开发过程中,有一些事件,例如:onresize,scroll,mousemove ,mousehover 等等,会被频繁的触发,如果不做限制,有可能一秒之内执行几十次,如果在这些函数内部执行了其他函数,尤其是执行了操作 DOM 的函数,那不仅会浪费计算机资源,还会降低程序运行速度,甚至造成浏览器卡死、崩溃。

三、函数防抖的代码实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>防抖</title>
</head>
<body>
  <input type="text" id="inp">
  <script>
  var oInp=document.getElementById('inp');
  function debounce( fn,delay){
    let timer = null
    return function(){
      var self=this,arg=argument;
      clearTimeout(timer)
      timer = setTimeout(function(){
         fn.apply(self,arg);
      },delay)
   }
  }
  function ajax(e) {
    console.log(e,this.value)
  }
  oInp.oninput=debounce(ajax,1000);
  </script>
</body>
</html>

对于debounce(fn,delay),返回值是一个函数,所以等同于el.οninput=denouceFn,只是一个新的事件处理函数而已,它的参数中就会包含事件对象,也就是arguments中包含事件对象。

四、什么是函数的节流

 概念:函数节流(throttle),就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。

    例子:坐公交车的时候,如果司机看到有人上车之后开始计时5分钟,5分钟一到马上发车。所以,“函数的节流”的关键在于,在 一个事件发生一定时间之后执行一次。

五、函数节流的实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>节流</title>
</head>
<body>
  <input type="text" id="inp">
  <script>
  var oInp=document.getElementById('inp')
  function throttle( fn,delay){
    let timer = null
    return function(){
     var self=this,arg=argument;
     if(timer) clearTimeout(timer)
     timer = setTimeout(function(){
       fn.apply(self,arg)
     },delay)
   }
  }
  function ajax(e) {
    console.log(e,this.value)
  }
  oInp.oninput=throttle(ajax,1000)
  </script>
</body>
</html>

 这里面clearTimeout(timer)清除了timer指向的定时器,timer=null,是修改timer的指向,是timer这个变量不指向某个定时器,然而并没有清除这个定时器,定时器依旧可以使用

上一篇:51单片机项目设计:基于51单片机时钟万年历


下一篇:数字后端之物理实现之Placement