小程序的防抖节流怎么写?

本文详细介绍了JavaScript中的函数防抖(debounce)和函数节流(throttle)的概念,提供了相应的代码封装示例,并展示了在实际应用场景中如何使用这两种优化技巧,如输入框输入监听和按钮点击事件处理。通过防抖和节流,可以有效地提高性能,避免频繁调用函数导致的资源浪费。

1.概念

函数防抖(debounce)

函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

简单的说,当一个动作连续触发,则只执行最后一次

如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)

函数节流(throttle)

限制一个函数在一定时间内只能执行一次。

保证如果电梯第一个人进来后,10秒后准时运送一次,这个时间从第一个人上电梯开始计时,不等待,如果没有人,则不运行

2. 代码封装

函数防抖(debounce)

/**
 *
 * @param {*} cb 回调函数
 * @param {*} delay 延时时间
 */
const debounce = (cb, delay = 1000) => {
   
   
  let timer = null;
  return function() {
   
   
    if (timer) {
   
   
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
   
   
      
在微信小程序中,通常将防抖节流函数封装在公用的 JS 文件里。以下是封装的具体代码及解释: ```javascript // common.js /* 函数节流 */ function throttle(fn, interval) { var enterTime = 0; // 触发的时间 var gapTime = interval || 300; // 间隔时间,如果 interval 不传值,默认为 300ms return function() { var that = this; var backTime = new Date(); // 第一次函数 return 即触发的时间 if (backTime - enterTime > gapTime) { fn.call(that, arguments); enterTime = backTime; // 赋值给第一次触发的时间,保存第二次触发时间 } }; } /* 函数防抖 */ function debounce(fn, interval) { var timer; var gapTime = interval || 1000; // 间隔时间,不传值默认为 1000ms return function() { clearTimeout(timer); var that = this; var args = arguments; // 保存 arguments,setTimeout 是全局的,arguments 不是防抖函数需要的 timer = setTimeout(function() { fn.call(that, args); }, gapTime); }; } /* 导出 */ export default { throttle, debounce }; ``` 上述代码中,`throttle` 函数实现了节流功能,它会限制函数的调用频率,确保在一定时间间隔内函数只执行一次。`debounce` 函数实现了防抖功能,它会在一定时间内如果没有再次触发事件,才会执行函数,如果在这段时间内再次触发了事件,则会重新计时。 使用方法如下: ```javascript // 导入 import tool from '路径'; Page({ data: { a: 0 }, // 默认时间(1 秒) onPageScroll: tool.throttle(function(a) { console.log(a); }), // 自定义时间 goUnlock: tool.debounce(function() { // ... }, 3000) }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值