防抖,节流 js

2023-05-16

概念:
函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

函数节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

函数防抖

实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法
缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟

函数防抖:将多次操作合并为一次操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

//防抖debounce代码:
function debounce(fn,delay) {
    var timeout = null; // 创建一个标记用来存放定时器的返回值
    return function (e) {
        // 每当用户输入的时候把前一个 setTimeout clear 掉
        clearTimeout(timeout); 
        // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
        timeout = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay);
    };
}
// 处理函数
function handle() {
    console.log('防抖:', Math.random());
}
        
//滚动事件
window.addEventListener('scroll', debounce(handle,500));

函数节流(throttle)

指连续触发事件但是在 n 秒中只执行一次函数。即 2n 秒内执行 2 次… 。节流如字面意思,会稀释函数的执行频率。
原理是通过判断是否有延迟调用函数未执行。

实现方式:每次触发事件时,如果当前有等待执行的延时函数,则直接return

//节流throttle代码:
function throttle(fn,delay) {
    let canRun = true; // 通过闭包保存一个标记
    return function () {
         // 在函数开头判断标记是否为true,不为true则return
        if (!canRun) return;
         // 立即设置为false
        canRun = false;
        // 将外部传入的函数的执行放在setTimeout中
        setTimeout(() => { 
        // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。
        // 当定时器没有执行的时候标记永远是false,在开头被return掉
            fn.apply(this, arguments);
            canRun = true;
        }, delay);
    };
}
 
function sayHi(e) {
    console.log('节流:', e.target.innerWidth, e.target.innerHeight);
}
/**
 - 节流函数,返回函数连续调用时,空闲时间必须大于或等于 wait,func 才会执行
 -   @param  {function} func        回调函数
 - @param  {number}   wait        表示时间窗口的间隔
 - @param  {boolean}  immediate   设置为ture时,是否立即调用函数
 - @return {function}             返回客户调用函数
 */
function throttle(func, wait = 3000, immediate = true) {
    let timer, context, args

    // 延迟执行函数
    const later = () => setTimeout(() => {
        // 延迟函数执行完毕,清空缓存的定时器序号
        timer = null
        // 延迟执行的情况下,函数会在延迟函数中执行
        // 使用到之前缓存的参数和上下文
        if (!immediate) {
            func.apply(context, args)
            context = args = null
        }
    }, wait)

    // 这里返回的函数是每次实际调用的函数
    return function(...params) {
        // 如果没有创建延迟执行函数(later),就创建一个
        if (!timer) {
            timer = later()
            // 如果是立即执行,调用函数
            // 否则缓存参数和调用上下文
            if (immediate) {
                func.apply(this, params)
            } else {
                context = this
                args = params
            }
            // 如果已有延迟执行函数(later),调用的时候清除原来的并重新设定一个
            // 这样做延迟函数会重新计时
        } else {
            clearTimeout(timer)
            timer = later()
        }
    }
}

使用

 <a href="javascript:void(0);" class="easyui-linkbutton" iconCls="icon-save" onclick='savebuttonLimit ()'>保存</a>
var savebuttonLimit = throttle(savebutton);

区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

原文链接:https://blog.csdn.net/zuorishu/article/details/93630578

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

防抖,节流 js 的相关文章

  • 大疆Onboard SDK 3.2玫瑰线例程浅析

    大疆Onboard SDK 3 2玫瑰线例程浅析 前不久参加2017英飞凌杯无人机竞赛 xff0c 研究了一下大疆的OnbardSDK xff0c 现在比赛结束了 xff0c 简单写一下其中自带的玫瑰线例程分析 xff0c 也算对比赛进行一
  • 利用stm32控制步进电机 速度&&加速度控制

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 利用stm32控制步进电机 尝试用42系步进电机做倒立摆 xff0c
  • stm32f4编码器模式

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 stm32f4编码器模式 花费一下午时间研究编码器的使用 xff0c
  • stm32 利用DMA+串口空闲中断接受任意长数据

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 目录 一 DMA1 简介2 使用场景3 主要特性4 DMA控制器结构5
  • 微星电脑安装win10+ubuntu16.04双系统遇到的各种坑

    最近尝试在微星电脑安装ubuntu 遇到各种问题 xff0c 在此记录一下 已有win10 xff0c 安装ubuntu16 04LTS版本微星ge73 Raider RGB 8RF显卡 xff1a GTX1070硬盘 xff1a 1T机械
  • 使用prim算法生成随机迷宫

    文章目录 一 关于随机迷宫生成二 prim算法1 最小生成树2 prim算法简介3 正确性证明 三 prim算法和迷宫生成1 迷宫生成和最小生成树的联系2 prim迷宫生成算法3 可以参考这些文章 一 关于随机迷宫生成 1 我们将迷宫定义如
  • TM4C123G学习记录(4)--关于ROM前缀函数和HWREG函数

    为了准备电赛临时学一下TM4C123G xff0c 简单记录学习内容大家可以在这里下载我收集的资源 xff0c 非常全面 xff0c 花了很大功夫收集来的 xff0c 还有书籍 例程代码等还可以在TI官网下载相关文档TI官网 这两天学习TM
  • TM4C123G学习记录(6)--UART

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 为了准备电赛临时学一下TM4C123G xff0c 简单记录学习内容大
  • TM4C123G学习记录(7)--输入捕获

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 为了准备电赛临时学一下TM4C123G xff0c 简单记录学习内容大
  • ANO匿名飞控分析(1)— 遥控器解码

    准备电赛 xff0c 简单写一下匿名飞控的分析基于TM4C主控的匿名拓空者飞控 xff0c 介绍见匿名科创 匿名拓空者PRO TI版全开源飞控使用入门 TM4C123 文章目录 一 简介二 PWM信号模式1 介绍2 硬件连接 三 PPM信号
  • OLAP分析引擎Druid配置文件详解(五):MiddleManager配置文件

    摘要 xff1a 本文是Druid配置文件系列博文的第五篇 xff0c 我们将继续逐个介绍Druid的五大组件 xff0c 本文将开始介绍Data Server中的middle manager和peon组件 以下配置都在middleMana
  • ANO匿名飞控分析(2)— 任务调度

    准备电赛 xff0c 简单写一下匿名飞控的分析基于TM4C主控的匿名拓空者飞控 xff0c 介绍见匿名科创 匿名拓空者PRO TI版全开源飞控使用入门 TM4C123 一 简介 匿名飞控的任务调度还是比较简单的 xff0c 没有操作系统什么
  • 点云地面点滤波(Cloth Simulation Filter, CSF)“布料”滤波算法介绍

    本篇博客参考Wuming Zhang的文章 An Easy to Use Airborne LiDAR Data Filtering Method Based on Cloth Simulation 不方便的小伙伴可以在此 xff1a 资源
  • TSCAN + TMODEL处理点云数据生成DEM

    点云数据生成DEM流程 目录 点云数据生成DEM流程1 软件环境2 操作流程2 1 加载TSCAN TMODEL插件2 2 读取点云数据2 3 点云去噪 滤波2 4 构建tin模型2 5 生成格网DEM2 6 查看DEM数据 对基于商业软件
  • LeGO-LOAM算法详解

    LeGO LOAM算法详解 整体框架 LeGO LOAM算法的总体框架如下图所示 xff1a 图中新增加了绿框中的Segmentation环节 xff0c 同时对后续的特征提取 Odometry以及Mapping部分均有一定的修改 xff0
  • 最速下降法解析(理解笔记)

    我们在高中或本科时期就了解到 xff1a 当函数存在解析形式且容易进行求导 xff08 f x f x f x 在最优点
  • ROS学习-tf介绍

    tf简介 一个机器人系统一个时间段通常有多个3D坐标系在变化 xff0c 如世界全局坐标系 xff0c world frame base frame gripper frame xff08 手臂 夹子坐标框架 xff09 xff0c hea
  • Anaconda 与 ROS 冲突解决

    Anaconda默认使用Python 3 而 ROS默认使用Python2 xff0c 若同时使用二者则会在调用一些ros包时出现冲突 目前解决方案是先在 bashrc文件中注释掉Anaconda xff1a span class toke
  • TI AWR1843毫米波雷达采集三维点云数据(ROS)

    毫米波雷达以其稳定性 对不同环境的适应能力 价格等方面的优势逐步引起了科研人员的注意 xff0c 本文主要介绍利用了TI xff08 德州仪器 xff09 的AWR1843设备 xff0c 基于ROS系统进行采集点云数据的流程 供大家参考及
  • 毫米波雷达原理介绍

    毫米波雷达是指工作在波长为1 10mm的毫米波段 xff0c 频率为30 xff5e 300GHz 基于其工作模式可以分为 脉冲 和 连续波 两种 其中 xff0c 脉冲类型的毫米波雷达的原理与激光雷达相似都是采用TOF的方法 而连续波类型

随机推荐

  • Ubuntu18.04使用Xorg创建虚拟屏幕

    目标 xff1a 使用远程软件 xff0c 如向日葵 TeamViewer Nomachine等来控制远程的电脑 xff08 Ubuntu 18 04桌面版本 xff09 作为服务端 存在问题 xff1a 被远程电脑若不连接屏幕会出现错误
  • 数学符号大全

    虽然在 Mathtype 能输入绝大多数想要的数学字符 xff0c 但是有些在 Visio 中无法输入 xff0c 可以在这里找出 xff0c copy就好了 xff0c 嘻嘻 xff5e 1 几何符号 2 代数符号 xff5e 3 运算符
  • 8小时用HTML5打造VNCViewer

    8小时用HTML5打造VNCViewer http cnborn net blog 另一个话题是ThoughtWorks徐昊带来的 8小时用HTML5打造VNCViewer 这个分享非常精彩 xff0c 其实现过程中的思考方式 使用的新技术
  • 自制ST-Link V2.1,带串口,可自动更新固件,含全套资料下载

    自制ST Link V2 1 xff0c 带串口 xff0c 可自动更新固件 xff0c 含全套资料下载 最近自制了一个带串口的ST Link V2 1 xff0c 现将全部资料共享给大家 xff0c 支持最新版的Keil 和IAR xff
  • LIO-SAM-自采数据运行踩坑

    一直觉得LIO SAM还是一个比较不错的激光雷达惯性里程计框架 xff0c 最近在使用自己的数据进行测试过程中出现了很多坑 xff0c 花费了一周多的时间才填平 xff0c 在此记录一下 前言 Ouster 128激光雷达数据Ouster内
  • ROS bag包提取数据

    日常使用中有时需要提取bag包中的某个topic数据为新的bag包 xff0c 或者裁剪其中的一段时间数据 这些功能均可以通过rosbag filter命令实现 下面 xff0c 我们简单介绍一下其使用流程 xff1a 首先 xff0c 使
  • Ouster激光雷达使用PTP时间同步

    IEEE1588 the Precision Time Protocol 简称为 PTP xff09 全称是 网络测量和控制系统的精密时钟同步协议标准 xff0c 可以使用ubuntu中的网卡作为时间的master也可以外接一个精准的时钟
  • MATLAB绘图:plot函数与bar函数详解

    MATLAB是由美国mathworks公司发布的主要面对科学计算 可视化以及交互式程序设计的高科技计算环境 我们可以利用它方便快捷的进行矩阵运算 绘制函数和数据 图像处理 前一段时间作者在进行毕业设计时使用MATLAB绘制了论文中的一系列插
  • 树莓派ubuntu mate系统连接PX4并通过UDP连接至QGC地面站

    前提条件 xff1a 树莓派安装了ubuntu mate 20 04系统ubuntu mate已经安装好ros 这里是noetic版本 系统 xff0c Mavros安装好QGC地面站的PCUSB数据线 xff08 确定能传输数据 xff0
  • make px4_sitl_default gazebo出现错误解决办法

    Ubuntu20 04按上图操作进行PX4配置的时候出现如下错误 xff08 确保你已经完整git Firmware或者已经翻墙 xff09 xff1a Configuring incomplete errors occurred See
  • ubuntu 常用命令汇总

    安装 sudo apt get install vim sudo apt get install nano 卸载 sudo apt get remove nano 给root用户设置密码 sudo passwd root 切换到root用户
  • 多任务学习-An Overview of Multi-Task Learning in Deep Neural Networks论文笔记

    An Overview of Multi Task Learning in Deep Neural Networks论文笔记 概述 xff1a 多任务学习有很多形式 xff0c 如联合学习 xff08 Joint Learning xff0
  • 结构体

    结构体 xff1a 结构是一些值的集合 xff0c 这些值称为成员变量 xff0c 每个成员可以是不同的类型变量 结构体成员的类型 xff1a 可以是 xff1a 标量 xff0c 数组 xff0c 指针 xff0c 结构体 struct
  • 【ROS-3】ROS实现图像目标检测

    1 darknet ros下载及编译 GitHub leggedrobotics darknet ros YOLO ROS Real Time Object Detection for ROS 直接下载zip就行 xff0c 解压到ros环
  • MapReduce实现基本SQL操作的原理

    Join的实现原理 select u name o orderid from order o join user u on o uid 61 u uid 在map阶段的输出中给每个value一个tag xff0c 用于区分数据来源 xff0
  • raw、qcow2、vmdk等虚拟机的镜像格式

    云计算用一个朋友的话来说 做云计算最苦逼的就是得时时刻刻为一些可能一辈子都碰不到的事做好准备 更苦逼的就是刚以为一个问题不会遇到 xff0c 立刻就发生了 这个还真的没有办法 xff0c 谁让哥我是搞云计算的呢 xff0c 简单一个虚拟化就
  • 树莓派3b安装win10的桌面版操作系统

    https www vediotalk com p 61 1999 目录 显示 国内播放节点 视频介绍 树莓派3b可以安装win10的桌面版操作系统 xff0c 大家也想体验的下 xff0c 不妨可以安装试试 xff0c 当然这并不能代替我
  • 无人机学习笔记之遥控篇

    遥控器 以LiteRadio 2c SE为例 1 遥控器按键 2 相关参数 3 遥控器工作原理 遥控器想要达到与无人机通信的功能需要有两部分配合完成 即 xff1a 发射器与接收机 遥控器上的控制杆转为无线电波发送给接收机 xff0c 而接
  • 二分类算法

    数据来源 xff1a 选自UCI机器学习库中的 银行营销数据集 Bank Marketing Data Set 算法完成目标 xff1a 这些数据与葡萄牙银行机构的营销活动相关 这些营销活动以电话为基础 xff0c 一般 xff0c 银行的
  • 防抖,节流 js

    概念 xff1a 函数防抖 debounce xff1a 触发高频事件后n秒内函数只会执行一次 xff0c 如果n秒内高频事件再次被触发 xff0c 则重新计算时间 函数节流 throttle xff1a 高频事件触发 xff0c 但在n秒