最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 函数的防抖与节流

    正文概述 掘金(极致同学)   2020-12-29   434

    防抖和节流的区别

    • 防抖:在一定间隔内疯狂触发函数的情况下,函数只执行一次。(至于是一触发,就执行,还是疯狂触发的最后一次执行可以自己控制,一般为了防止延迟,都是选择第一次触发就执行。)假如,我们设定的间隔是500ms,那么在触发间隔小于500ms的都算是疯狂触发函数,只会执行一次。当触发间隔大于500ms后,就会重新计算执行函数。

      应用场景:按钮点击

    • 节流:在连续触发函数的一定时间内,根据设置的时间间隔,每过一个时间间隔触发一次函数就是节流。例如,我疯狂触发了一个函数持续1min,设置的时间间隔是500ms,那么这个函数在这1min内,每隔500ms就会执行一次。

      应用场景:页面滚动,拖拽

    防抖代码实现

    参数:

    • funcFunction,代表要执行的函数(业务)
    • waitNumber , 代表连续触发的最大时间间隔,默认值500ms
    • immediateBoolean,是否一触发就执行,默认值是false
    1. 定时器方式
    function debounce(func, wait=500, immediate=false) {
      let timer = null;
      return function proxy(...params) {
        let self = this;
        if (immediate) {
          !timer ? func.call(self, ...params) : null;
          clearTimeout(timer);
          timer = setTimeout(() => {
            timer = null;
          }, wait);
        } else {
          clearTimeout(timer);
          timer = setTimeout(() => {
            timer = null;
            func.call(self, ...params);
          }, wait);
        }
      };
    }
    
    1. 时间戳
    function debounce(func, wait=500, immediate=false) {
        let now = 0;
        let timer = null;
        return function proxy(...params) {
          let thenow = Date.now();
          if (immediate) {
            thenow - now >= wait ? func.call(this, ...params) : null;
            now = thenow;
          } else {
            clearTimeout(timer);
            timer = setTimeout(() => {
              timer = null;
              func.call(this, ...params);
            }, wait);
          }
        };
    }
    

    我发现好像利用时间戳的方式没有办法实现后执行,只能实现先执行的这种情况。

    节流代码实现

    function throttle(func, wait, immediate) {
      let now = 0;
      let timer = null;
      return function proxy(...params) {
        let thenow = Date.now();
        let waiting = wait - (thenow - now);
        if (immediate) {
          if (waiting <= 0) {
            func.call(this, ...params);
            now = thenow;
          } else {
            if (!timer) {
              timer = setTimeout(() => {
                func.call(this, ...params);
                now = Date.now();
                timer = null;
              }, waiting);
            }
          }
        } else {
          if (!timer) {
            timer = setTimeout(
              () => {
                func.call(this, ...params);
                now = Date.now();
                timer = null;
              },
              waiting >= 0 ? waiting : wait
            );
          }
        }
      };
    }
    

    虽然上面写了立即执行和延迟执行两种,但是一般不会选择延迟执行这种方式


    起源地下载网 » 函数的防抖与节流

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元