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

    正文概述 掘金(变态的小水瓶)   2021-01-11   415

    定义:

    • 节流:

    函数节流是指某个函数在一个时间段内(如3s)执行了一次,则在这段时间内无论触发多少次都不再执行,直到到下一个时间段再执行;

    • 防抖:

    防抖是指每次触发都重置一个等待时间,在这个等待时间内多次触发时,只能在最后一次触发再过一个等待时间时执行一次函数;

    举例理解:

    举个生活的例子可能更好理解一些:

    • 节流,可以理解为一个画家一天只会画一幅画,即使他半天就能画完,但是他这一天只画这一幅,只能等第二天再画第二幅。

    • 防抖,可以理解为一辆公交车想要关门这个操作,但一直有人要上车,想关门只能等最后一个人上车后5s内没有人还要上车时,才可以关门。

    代码实现:

    节流简单实现:

    const throttle = (fn, wait = 50) => {
      let previous = 0;//闭包存上次触发的时间
      return function(...args) {
        let now = +new Date();
        if (now - previous > wait) {
          previous = now;
          fn.apply(this, args);
        }
      };
    };
    const betterFn = throttle(() => console.log("fn 函数执行了"), 3000);
    setInterval(betterFn, 1000);
    

    解析:

    • throttle高阶函数处理包装入参的函数(() => console.log("fn 函数执行了"));
    • previous 闭包存上次成功执行的时间;
    • betterFn每1秒调用1次,记录当前时间比较是否超过设定时间,如没超过代表触发太频繁了不想执行,如果超过了设定时间,代表距离上次成功执行有一定时间了,允许执行并记录时间到previous;
    • 如果总时间是10s,如上的节流改造后,会在第0s,3s,6s,9s执行4次(暂不考虑定时器不准的因素);

    防抖简单实现:

    function debounce(fn, wait = 50) {
      let timer = null;
      return function(...args) {
        if (timer) clearTimeout(timer);
        timer = setTimeout(() => {
          fn.apply(this, args);
        }, wait);
      };
    }
    const betterFn = debounce(() => console.log("fn 防抖执行了"), 1000);
    document.addEventListener("mousemove", betterFn);
    

    解析:

    • timer闭包存储定时器,内部函数可以访问到;
    • 高频触发betterFn时,如果有定时器就清掉重新定时,直到设定时间到了才执行函数;
    • 如果一直触发不停下来,那就一直重新计时间,就一直不执行;

    应用场景:

    • 一些鼠标滚动事件,鼠标移动事件需要回调函数处理一些业务逻辑,但又想提高性能,不想频繁执行函数导致页面卡死,可以使用;
    • 工具库:underscore.js、lodash.js

    起源地下载网 » 浅谈「节流」与「防抖」函数

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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