评论

【优化】利用函数防抖和函数节流提高小程序性能

本文主要介绍函数防抖和函数节流在小程序中的应用

大家好,上次给大家分享了swiper仿tab的小技巧: https://developers.weixin.qq.com/community/develop/article/doc/000040a5dc4518005d2842fdf51c13

今天给大家分享两个有用的函数,《函数防抖和函数节流》



函数防抖和函数节流是都优化高频率执行js代码的一种手段,因为是js实现的,所以在小程序里也是适用的。

首先先来理解一下两者的概念和区别:

    函数防抖(debounce)是指事件在一定时间内事件只执行一次,如果在这段时间又触发了事件,则重新开始计时,打个很简单的比喻,比如在打王者荣耀时,一定要连续干掉五个人才能触发hetai kill '五连绝世'效果,如果中途被打断就得重新开始连续干五个人了。


    函数节流(throttle)是指限制某段时间内事件只能执行一次,比如说我要求自己一天只能打一局王者荣耀。

    

    这里也有个可视化工具可以让大家看一下三者的区别,分别是正常情况下,用了函数防抖和函数节流的情况下:http://demo.nimius.net/debounce_throttle/

适用场景

函数防抖

  • 搜索框搜索联想。只需用户最后一次输入完,再发送请求
  • 手机号、邮箱验证输入检测
  • 窗口resize。只需窗口调整完成后,计算窗口大小。防止重复渲染
  • 高频点击提交,表单重复提交

函数节流

  • 滚动加载,加载更多或滚到底部监听

  • 搜索联想功能

    实现原理

      函数防抖
    
const _.debounce = (func, wait) => {
  let timer;
 
  return () => {
    clearTimeout(timer);
    timer = setTimeout(func, wait);
  };
};
    函数节流
const throttle = (func, wait) => {
  let last = 0;
  return () => {
    const current_time = +new Date();
    if (current_time - last > wait) {
      func.apply(this, arguments);
      last = +new Date();
    }
  };
};
     上面两个方法都是比较常见的,算是简化版的函数

lodash中的 Debounce 、Throttle

    lodash中已经帮我们封装好了这两个函数了,我们可以把它引入到小程序项目了,不用全部引入,只需要引入debounce.js和throttle.js就行了,链接:https://github.com/lodash/lodash

    
    
    使用方法可以看这个代码片段,具体的用法可以看上面github的文档,有很详细的介绍:https://developers.weixin.qq.com/s/vjutZpmL7A51
最后一次编辑于  2019-02-22  
点赞 10
收藏
评论

7 个评论

  • 沐风
    沐风
    2019-12-21

    这个防抖放在function里就不执行了

    2019-12-21
    赞同 3
    回复
  • 2020-06-30

    都执行不了啊 怎么回事

    2020-06-30
    赞同 1
    回复
  • 小肥羊🍊
    小肥羊🍊
    2020-01-03

    过来学习的,非常好的文章。

    2020-01-03
    赞同
    回复
  • 沫笺
    沫笺
    2019-12-10

    debounce函数里写this,会指向错误,怎么办?

    2019-12-10
    赞同
    回复 3
    • 沫笺
      沫笺
      2019-12-10
      原来e这里不用箭头函数就可以了
      2019-12-10
      回复
    • 管
      2023-11-08
      请问this指向问题解决了吗?我也遇到了这个问题
      2023-11-08
      回复
    • heora
      heora
      03-22回复
      this 指向问题,内层函数需要是 function,另外调用的时候,匿名函数也需要是 function,不能是箭头函数。
      03-22
      回复
  • Fants
    Fants
    2019-11-06

    很不错,用了

    2019-11-06
    赞同
    回复
  • 2019-08-30

    请问一下,如何做到scroll-view的bindscroll事件的节流

    2019-08-30
    赞同
    回复
  • 小科
    小科
    2019-02-26

    你确定只需要引入这两个JS么,那这两个模块的依赖去哪找

    2019-02-26
    赞同
    回复 1
    • var 友原
      var 友原
      2019-02-26

      这只是两个js文件啊,没有依赖

      2019-02-26
      回复
登录 后发表内容