函数的防抖与节流

2023-11-18

一、防抖与节流的联系

        相同点:防抖(Debounce)和节流(Throttle)都是用来控制某个函数在一定时间内触发次数,两者都是为了减少触发频率,以便提高性能以及避免资源浪费

        不同点:节流是第一个说了算,后续都会被节流阀屏蔽掉,防抖是最后一个说了算,前面启用的都会被清除

二、节流函数

        1.定义:节流就是指连续触发事件但是在 n 秒中只执行一次函数,节流会稀释函数的执行频率

        2.分类:        

        (1)使用时间戳实现的节流函数会在第一次触发事件时立即执行,以后每过 delay 秒之后才执行一次,并且最后一次触发事件不会被执行

        节流函数输入一个函数并返回一个函数(高阶函数)

        节流使用闭包,保存上一次触发回调的时间 last,执行函数 func,时间阀值delay

        在要执行 func 时,当前时间与上一次触发时间进行比较,如果时间间隔大于interval(now - last >= interval),执行函数 func.apply(context, args)

// 时间戳方式
// 节流 事件连续触发在n秒内只触发一次
function throttle(func, interval) {
  // last为上一次触发回调的时间
  let last = 0;
  // 将throttle处理结果当作函数返回
  return function() {
    // 保留调用时的this上下文
    let context = this;
    // 保留调用时传入的参数
    let args = arguments;
    // 记录本次触发回调的时间
    let now = Date.now();
    // 判断上次触发的时间和本次触发的时间差是否小于时间间隔的阈值
    if (now - last >= interval) {
      // 如果时间间隔大于我们设定的时间间隔阈值,则执行回调
      last = now
      func.apply(this, args);
    }
  }
}

        (2)定时器实现的节流函数在第一次触发时不会执行,而是在 interval秒之后才执行,当最后一次停止触发后,还会再执行一次函数

// 定时器方式
function throttle1(func, interval) {
  let sign = true;
  return function() {
    // 在函数开头判断标志是否为 true,不为 true 则中断函数
    if (!sign) return;
    //  sign 设置为 false,防止执行之前再被执行
    sign = false;
    setTimeout(() => {
      func.apply(this, arguments)
      // 执行完事件之后,重新将这个标志设置为 true
      sign = true;
    }, interval)
  }
}

        3.使用场景 

        节流一般用于鼠标的跟随动画实现,scrollresizetouchmovemousemove等极易持续性促发事件的相关动画问题,降低频率

<!-- 节流函数 获取鼠标在元素上的坐标 -->
<style>
  .container {
    width: 100px;
    height: 100px;
    background-color: #3496db;
  }
</style>

<div class="container"></div>

<script>
  function throttle(func, interval) {
    let last = 0;
    return function() {
      let args = arguments;
      let now = Date.now();
      if (now - last > interval) {
        func.apply(this, args);
        last = now
      }
    }
  }
  box.addEventListener('mousemove', throttle(function(e){
    console.log(e.pageX)
  }, 2000))
</script>

三、防抖函数

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

<input type="text">
<script>
  // 防抖 事件触发 n 秒后执行一次, 如果在 n 秒内重复触发则重新计算函数执行时间
  function debounce(func, interval) {
    // 设置标识符
    let timer = null;
    return function () {
      // 判断定时器是否存在,清除定时器
      timer && clearTimeout(timer)
      // 重新调用setTimeout
      timer = setTimeout(() =>  {
        func.apply(this, arguments)
        timer = null;
      }, interval)
    }
  }
  let input = document.querySelector('input');
  let inputValue = debounce(inputChange, 1000)
  function inputChange(e) {
    console.log(e.target.value)
  }
  input.addEventListener('keyup', inputValue)
</script>

        防抖函数也是一个高阶函数,也使用了闭包,与节流不同,此处闭包保存的是setTimeout 返回的 timer,用于在后续持续触发之前及时取消定时器

        2.使用场景

        防抖一般用于表单元素的校验,如手机号,邮箱,用户名等,部分搜索功能的模糊查询结果实现

<!-- 防抖函数 表单校验 -->
<input type="text" replacer="请输入内容">
<script>
  let input = document.querySelector('input');
  function debounce(func, interval) {
    let timer;
    return function() {
      timer && clearTimeout(timer)
      let args = arguments;
      timer = setTimeout(() => {
        func.apply(this, args)
        timer = null;
      }, interval)
    }
  }
  input.addEventListener('keyup', debounce(function(event) {
    let regexp = /\d/g;
    if(!regexp.test(event.target.value)) {
      console.log('输入错误')
    } else {
      console.log(event.target.value)
    }
  }, 1000))
</script>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数的防抖与节流 的相关文章

随机推荐

  • 可能是全网最清晰的KMP算法讲解

    字符串匹配 字符串A是否为字符串B的子串 如果是 出现在B的什么位置 这个问题就是字符串匹配问题 字符串A称为模式串 字符串B称为主串 那么 如何查找模式串在主串中的位置呢 暴力匹配 暴力匹配 顾名思义 是一种简单粗暴的匹配方法 从主串的第
  • ubuntu上安装微信

    一 下载安装Wine环境包 http archive ubuntukylin com software pool partner ukylin wine 70 6 3 25 amd64 deb 二 下载安装微信包 http archive
  • Oracle:修改表空间和数据文件的名称

    1 修改表空间名称 alter tablespace tablespace name1 rename to tablespace name2 2 修改数据文件名称 1 先将联机状态的需要修改的表空间设置为脱机状态 ALTER TABLESP
  • 解决Value '0000-00-00 ' can not be represented as java.sql.Timest

    在使用MySql 时 数据库中的字段类型是timestamp的 默认为0000 00 00 会发生异常 java sql SQLException Value 0000 00 00 can not be represented as jav
  • javascript画全年日历

    前些日子闲聊群里有人提了用js画全年日历的需求 趁闲暇时间画了个小demo 下面还是先上效果图吧 高亮显示的是今天的日期和标记要高亮显示的日期 也添加了点击事件的钩子 自己可以实现钩子函数 从而操作点击的日期值 下面还是先上dai 日历视图
  • Linux 系统 /var/log/journal/ 垃圾日志清理

    CentOS系统中有两个日志服务 分别是传统的 rsyslog 和 systemd journal systemd journald是一个改进型日志管理服务 可以收集来自内核 系统早期启动阶段的日志 系统守护进程在启动和运行中的标准输出和错
  • 第1章 Java基础(二)

    1 11 重写和重载的概念 难度 重点 白话解析 这道题它的重点不仅仅是在面试中 因为后续在做开发的时候会接触到大量的重写或重载 也正是因为他们 才实现了Java的多态特性 1 重写 好好理解下 就是本来父亲写好了一个方法 然后儿子觉得父亲
  • 你的Qt按钮可以加载Gif圆形的头像吗?

    先上效果 先看要求 我们首先要求 1 这是一个按钮 所以可以想到重写控件的基类一定是QPushButton 2 我们要求可以播放Gif图片 由此可想到 图片的加载肯定绕不开QMoive 3 头像是圆形的 猜想是不是可以通过样式表 或者重新p
  • 第36步 深度学习图像识别:TensorFlow-gpu环境配置

    基于WIN10的64位系统演示 一 写在前面 从这一期开始分享基于深度学习图像识别的学习笔记和代码 相比于之前的ML分类模型 图像识别的门槛会更高 包括硬件方面 代码复杂度和基础理论知识等 同样 首先把必要的深度学习框架 类似做ML分类 要
  • Windows巧用git实现笔记自动备份

    Windows巧用git实现笔记自动备份 准备git仓库 配置自动上传脚本 设置 Windows 自动定时任务 参考文献 今天突然发现 可以 使用Gitee加上Windows定时任务 实现Windows端的笔记 自动备份 多端同步 历史回溯
  • gin 获取get 所有参数_Golang Gin 实战(三)

    在 上一篇 Golang Gin 实战 二 简便的Restful API 实现 文章中 我们留了一个疑问 假如我们有很多用户 我们要为他们一个个注册路由 路径 吗 路由路径 如下URL users 123 users 456 users 2
  • 【Android】相对布局(RelativeLayout)最全解析

    Android 相对布局 RelativeLayout 最全解析 一 相对布局 RelativeLayout 概述 二 根据父容器定位 三 根据兄弟控件定位 一 相对布局 RelativeLayout 概述 相对布局 RelativeLay
  • 【模型融合】集成学习(boosting, bagging, stacking)原理介绍、python代码实现(sklearn)、分类回归任务实战

    文章目录 概览 boosting bagging Stacking 投票 平均 Stack 代码实现 1 分类 1 0 数据集介绍 1 1 boosting 1 2 bagging 1 3 stacking 2 回归 2 0 数据集介绍 s
  • xenserver6.5 重启后退不出 maintenance mode 的解决

    环境 XenServer 6 5 开源版本 故障起因 2017 6 9 因虚拟机在访问里面的服务时特别的卡慢 所以对宿主主机进行物理重启 但是重启后用xencenter却启不起来xen服务器 显示在维护模式 exit maintenance
  • v-model是什么?怎么使用?

    v model是什么 怎么使用 v model用于表单数据的双向绑定 其实它就是一个语法糖 这个背后就做了两个操作 v bind绑定一个value属性 v on指令给当前元素绑定input事件 v model很好地体现了vue双向绑定的理念
  • C++11 chrono计时

    我的C 文章列表 C 中Duration Time point和Clocks 万里归来少年心的博客 CSDN博客 time point C 11中的chrono库 实现时间相关的功能 1 time point time point表示一个时
  • 什么是php 服务器地址,服务器地址是什么

    服务器地址是服务器的ip地址 IP地址就是给每个连接在互联网上的主机分配的一个32位地址 有这种地址 才保证了用户在连网的计算机上操作时 能够高效而且方便地从千千万万台计算机中选出所需的对象来 本文操作环境 Windows7系统 Dell
  • AI 对抗超级细菌:麦克马斯特大学利用深度学习发现新型抗生素 abaucin

    内容一览 鲍曼不动杆菌是一种常见的医院获得性革兰氏阴性病原体 通常表现出多重耐药性 利用传统方法 发现抑制此菌的新型抗生素很困难 但利用机器学习可以快速探索化学空间 从而增加发现新型抗菌分子的可能性 近期 国际期刊 Nature Chemi
  • Java生成纳秒时间戳

    记一次生成高精度时间戳 类似与 net的时间戳 码着备忘 long timestamp System currentTimeMillis 1000000L System nanoTime 1000000L System currentTim
  • 函数的防抖与节流

    一 防抖与节流的联系 相同点 防抖 Debounce 和节流 Throttle 都是用来控制某个函数在一定时间内触发次数 两者都是为了减少触发频率 以便提高性能以及避免资源浪费 不同点 节流是第一个说了算 后续都会被节流阀屏蔽掉 防抖是最后