如何实现节流函数和防抖函数


前言

节流函数和防抖函数两个都属于优化高频率执行js代码的一种手段


提示:那么它们两个有什么区别,又是怎么实现的呢

一、节流函数

1.概念

事件被触发,N秒之内无论触发多少次只执行一次事件处理函数,输入验证比较适合函数节流

2.如何实现

先定义一个文本输入框

<input id="input" type="text">

这是实现代码

let input = document.getElementById('input');
  input.onkeyup = throttle(check, 1000);
  let t = null;

  function throttle(fn, delay) {
    let t = null, beginTime = new Date().getTime();
    return function () {
      var _this = this, args = arguments, curTime = new Date().getTime();
      clearTimeout(t);
      if (curTime - beginTime >= delay) {
        fn.apply(_this, args);
        beginTime = curTime;
      } else {
        // 进行延迟操作
        t = setTimeout(function () {
          fn.apply(_this, args);
        }, delay)
      }
    }
  }

  function check() {
    let val = this.value;
    if (val.length < 6) {
      console.log('长度小于6,输入不合格');
    } else {
      console.log('success');
    }
  }

二、防抖函数

1.概念

防抖函数就是N秒内只要你触发事件,就重新计时,事件处理函数的程序将永远不能被执行
函数防抖:
1.对于在事件被触发N秒后,再执行的回调=>延迟执行
2.如果在在这N秒内再次触发事件,重新开始计时

2.如何实现

先定义一个按钮和一个文本输入框

<button id="btn" style="width: 300px;height: 300px;background-color: #000000;">获取数据</button>
<input type="text" id="input">

这是实现代码

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
function debounce(fn, time, triggleNow) {
    let t = null;
    var debounce = function () {
      // 保存this执行
      let _this = this,
        // 如果返回的函数是有参数,那么我们也需要把参数加上
        args = arguments;
      // 如果进来t为null,那么把计时器清除掉
      if (t) {
        clearTimeout(t);
      }
      // 判断第一次进入是否需要延迟执行,
      if (triggleNow) {
        // 如果是true,首次进入不需要进行延迟
        let exec = !t;
        // 因为上面t已经被clearTimeout清除了,第一次是不需要防抖的,这里再把t赋值null
        t = setTimeout(function () {
          t = null;
        }, time);
        if (exec) {
          fn.apply(_this, args);
        }
      } else {
        // 每次都是延迟
        t = setTimeout(function () {
          fn.apply(_this, args);
        }, time);
      }
    }
    // 强制取消放抖
    debounce.remove = function () {
      clearTimeout(t);
      t = null;
    }
    return debounce;
  }

  let btn = document.getElementById('btn');
  // 调用debounce,这里第三个参数为true,会立刻调用请求,如果为false,则会1秒后获取请求
  btn.onclick = debounce(btnClick, 1000, true);

  function btnClick() {
    $.ajax({
      url: 'http://poetry.apiopen.top/getTime',
      type: 'GET',
      dataType: 'JSON',
      success: function (res) {
        console.log(res);
      }
    })
  }

  let input = document.getElementById('input');
  //文字输入不需要立刻获取,所以设置首次也不用马上触发
  input.onkeyup = debounce(check, 1000, false);

  function check() {
    var val = this.value;
    if (val.length < 6) {
      console.log('长度小于6,输入不合格');
    } else {
      console.log('success');
    }
  }

总结

以上就是这篇文章要讲的内容,本文仅仅简单介绍了防抖函数和节流函数的定义和如何使用及封装,都属于前端优化高频率执行js代码的一种手段。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值