函数防抖和函数节流都是老生常谈的问题了。这两种方式都能优化 js 的性能。有些人可能会搞混两个的概念。所以,我以自己的理解,来解释这两个概念的含义。并且列举在小程序中这两个方法的使用。

函数防抖: 英文 debounce 有防反跳的意思,大致就是指防止重复触发。

那么,函数防抖,真正的含义是:延迟函数执行即不管debounce函数触发了多久,只在最后一次触发debounce函数时,才定义setTimeout,到达间隔时间再执行 需要防抖的函数。

用处:多用于 input 框 输入时,显示匹配的输入内容的情况。

函数节流: 英文 throttle 有节流阀的意思。大致意思也是 节约触发的频率

那么,函数节流,真正的含义是:单位时间n秒内,第一次触发函数并执行,以后 n秒内不管触发多少次,都不执行。直到下一个单位时间n秒,第一次触发函数并执行,这个n秒内不管函数多少次都不执行。

用处:多用于页面scroll滚动,或者窗口resize,或者防止按钮重复点击等情况

其实如果只根据 控制函数触发的频率是不好区分这两个概念的。我认为两个函数都能达到防止重复触发的功能。但是函数防抖是 n秒后延迟执行;而函数节流是立马执行,n秒后再立马执行。

在小程序中,函数防抖、函数节流的使用方式:

一般都会把这两种方法封装在公用的 js 中:

/*函数节流*/
function throttle(fn, interval) {var enterTime = 0;//触发的时间var gapTime = interval || 300 ;//间隔时间,如果interval不传,则默认300msreturn function() {var context = this;var backTime = new Date();//第一次函数return即触发的时间if (backTime - enterTime > gapTime) {fn.call(context,arguments);enterTime = backTime;//赋值给第一次触发的时间,这样就保存了第二次触发的时间}};
}/*函数防抖*/
function debounce(fn, interval) {var timer;var gapTime = interval || 1000;//间隔时间,如果interval不传,则默认1000msreturn function() {clearTimeout(timer);var context = this;var args = arguments;//保存此处的arguments,因为setTimeout是全局的,arguments不是防抖函数需要的。timer = setTimeout(function() {fn.call(context,args);}, gapTime);};
}export default {throttle,debounce
};

使用

import tool from "../../static/js/tool.js";
Page({data:{win_scrollTop:0},onPageScroll: tool.throttle(function(msg){this.setData({win_scrollTop: msg[0].scrollTop});}),gotoUnlock: tool.debounce(function() {this.saveUserInfo();}),saveUserInfo:function(){console.log(111)}
})

上面的两种方式只是精简版的,可能还有某些情况没考虑到,以后遇到了再优化。

函数节流的说明:

(1) 第一次执行时,是一定能执行函数的。

(2) 然后 n秒内第二次触发的时候,当第一次与第二次间隔不足 设置的间隔时间时,就不会执行。之后第三、第四次触发还是不执行。

(3) 直到 n秒之后 有且仅有一次,并且是第一次再次触发函数。

函数防抖的说明:

(1) 第一次触发函数时,定义了一个定时器。在 n秒后执行。

(2) 然后 函数第二次触发的时候,由于闭包的特性,这时候的 timer已经是第一次触发时的 定时器的标识了。然后直接清除第一次的setTimeout,这时候第一次的setTimeout里面的内容就不会执行了。然后再定义第二次的setTimeout。

(3) 然后重复第二个步骤,一直清除,又一直设置。直到函数最后一次触发,定义了最后的一个定时器,并且间隔 n秒 执行。

(4) 如果在 最后一个定时器没执行时,函数又触发了,那么又重复第三步。相当于 设置的间隔时间,只是延迟函数执行的时间,而不是间隔多少秒再执行。

到这里,这两个方式的区别就很明显了。函数节流是减少函数的触发频率,而函数防抖则是延迟函数执行,并且不管触发多少次都只执行最后一次。

这里借鉴了  https://www.cnblogs.com/zjjDaily/p/10840276.html 的文章

微信小程序 防抖节流相关推荐

  1. 微信小程序防抖处理 高频访问

    防抖: 需要将要执行的数据放入,进行延时处理 clearTimeout(this.TimeID);         this.TimeID = setTimeout(() => {       ...

  2. 微信小程序验证码获取攻略:让你秒懂如何快速获取验证码

    前言 微信小程序作为移动互联网的一部分,受到了广泛的欢迎.但是,在使用微信小程序的过程中,获取验证码却是不可避免的一环.那么如何让获取验证码变得更加方便快捷?本文将为您介绍微信小程序获取验证码的方法, ...

  3. 微信小程序实现输入框防抖

    防抖 在小程序上使用之前得先介绍一下防抖.无非就是将一个频繁的操作延迟触发并且同时减少触发次数. 本质就是利用闭包保存定时器数据,并且在延迟时间内频繁触发会清除上一次的定时器操作.最后能触发的只能是触 ...

  4. 防抖- 微信小程序输入框input

    微信小程序input输入框的bindinput,每输入一个字符都会触发一次,为了避免频繁触发bindinput绑定的函数,可采用"防抖"功能. 防抖:在执行bindinput时,第 ...

  5. 微信小程序input搜索解决中文问题(输入拼音) 实时搜索节流处理(bindinput 节流)

    微信小程序input搜索解决中文问题(输入拼音) & 实时搜索节流处理(bindinput 节流) 问题 微信小程序输入拼音的时候, 还没有完全输入完成, bindinput就会触发, 当我输 ...

  6. 微信小程序开发基础入门笔记

    文章目录 vsc 安装插件(小程序开发助手-微信小程序开发助手) 日常注意: 微信小程序WXS模块的使用 框架 1小程序结构和传统的web结构 2 基本的项目目录 3全局配置app.js 4.运算 = ...

  7. 微信小程序wxml如何判断字符串中汉语某字符_微信小程序开发经典案例解析“嗨兔儿”...

    嗨兔儿是微信公众号嗨日语歌(hitaici)助手,主要为用户提供,关键词检索,帮助手册等,为外语学习者提供一个便捷的操作方式,能够开心工作,开心生活. 开发过程及注意事项分享视频. 1. 微信小程序开 ...

  8. 【小程序】爆肝 3 天总结的微信小程序优化指南(收藏夹吃灰吧!)

    前言 大家好,我是HoMeTown,最近要做一个小程序的项目,项目启动之前,回顾自己之前做过的小程序,感觉做的还是不够好,最近学习了一下小程序优化方案,这块总结一份个人笔记,以便参考,同时分享给大家, ...

  9. 微信小程序 自动解决分包大小问题_2020微信小程序前端面试题汇总

    [持续更新,欢迎补充] 1.文件类型 WXML--模板文件 JSON--配置/设置文件,如标题,tabbar,页面注册 WXSS--样式文件,样式可直接用import导入 JS--脚本逻辑文件,逻辑处 ...

最新文章

  1. as死机了怎么办_Acer AS574/G开机死机故障排除手记
  2. springboot整合websocket实现一对一消息推送和广播消息推送
  3. html基础--列表标签03,03HTML基础--列表标签
  4. vc++创建异性窗体(2)
  5. 第5章 初识JQuery
  6. GOF之结构型模式Ⅱ(重点)
  7. TCP/IP原理 (四) IP编址
  8. centos php 绑定域名,centos如何绑定域名?
  9. 传世经典书丛-UNIX编程艺术
  10. 这些Python骚操作,你知道吗?
  11. 了解PHP中$_SERVER变量对路径的解析
  12. 火山应用系列之调用炫彩模块自制登陆与主窗口
  13. vivo手机如何开启云服务器,怎么开启vivo手机中的云服务自动备份功能
  14. 华为认证hcia含金量_华为hcna认证用处大吗 什么是hcna
  15. Podfile、Podfile.lock、Manifest.lock、Podspec
  16. 收集整理的一些windows好用的工具(持续更新)
  17. linux下的蓝牙驱动程序详解
  18. 关于web项目log日志指定输出文件位置配置
  19. 微信小程序 #项目笔记# | 从0到1实现外卖点餐系统小程序
  20. uniapp app内使用微信H5支付

热门文章

  1. eclipse转android studio解决GBK编码转换为UTF-8格式的方法
  2. python吃显卡还是内存不足_Pythorch中的GPU内存问题,GPUMemoryProblemsinPyTorch,显卡,爆炸,与,利用率,不足...
  3. 上海计算机研究生学校排名,2018考研:计算机专业全球院校排名公布,上海交通大学竟排第一?...
  4. [Gource可视化]魔兽世界玩家成就动态演示
  5. 某房产中介服务器托管及安全方案(上)
  6. 幽默搞笑短信-(很雷人的短信笑话)
  7. hadoop中GroupingComparator分组(辅助排序)
  8. Java快递物流查询接口,怎么接入物流接口API,如何根据单号查询物流跟踪的详细信息的Demo详细说明。
  9. 初学游戏建模怎么入门
  10. 【数据结构和算法】第七锻造,链表真身