防抖(debounce)函数

手写防抖debounce函数,细节拆解每一步,学会你也会手写一个完美的防抖函数【JavaScript】 手写防抖函数debounce,细节拆解每一步,学会你也会手写一个完美的防抖函数 阅读详情

 

防抖的原理

防抖(debounce)的基本原理是将多次执行合并为一次执行。具体来说,当事件频繁触发时,防抖机制会在每次事件触发时重置计时器,只有当事件在一定时间内没有再次触发时,函数才会执行。这样可以避免函数在短时间内被多次调用,从而提高性能和响应速度。

实现步骤:
  1. 初始化一个计时器:在防抖函数内部创建一个计时器变量。
  2. 清除计时器:每次事件触发时,清除之前的计时器。
  3. 设置新计时器:重新设置一个新的计时器,在指定时间后执行目标函数。
  4. 延迟执行函数:只有当事件在指定的延迟时间内没有再次触发时,目标函数才会被执行。

应用场景

防抖机制主要用于需要限制函数频繁调用的场景。以下是一些常见的应用场景:

  1. 搜索框输入:

    • 在用户输入搜索关键字时,如果每次输入变化都触发搜索请求,会导致大量的请求发送到服务器。使用防抖机制可以确保只有用户停止输入后的一段时间内才发送一次请求,从而减少请求次数。
  2. 窗口调整大小:

    • 在窗口大小变化时,频繁触发调整事件可能导致性能问题。使用防抖机制可以确保只有窗口大小调整完成后再执行调整函数。
  3. 滚动事件:

    • 页面滚动时可能会触发大量的滚动事件,使用防抖机制可以减少滚动事件的处理次数,提升页面性能。
  4. 按钮点击:

    • 防止按钮被快速重复点击多次,导致函数被多次调用,可以使用防抖机制限制按钮的点击频率。

  代码示例如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<button id="myButton">连续点击测试</button>

<script>

    function Debounce(fn, delay) {
        this.fn = fn; // 需要防抖的函数
        this.delay = delay; // 延迟时间
        this.timer = null; // 定时器

        // 包装的防抖函数
        this.debounced = function() {
            var context = this;
            var args = arguments;

            clearTimeout(this.timer);
            this.timer = setTimeout(function() {
                fn.apply(context, args);
            }, delay);
        };
    }

   
    function sayHello(name) {
        console.log('Hello, ' + name + '!');
    }

    var debouncedSayHello = new Debounce(sayHello, 500);

    // 绑定事件
    document.getElementById('myButton').addEventListener('click', function() {
        debouncedSayHello.debounced('World');
    });

</script>

</body>
</html>

js 函数防抖(debounce)与节流(throttle) 一、函数防抖 二、函数节流 阅读详情

相关推荐

函数防抖(debounce)实现方案全解

防抖(debounce)是一种事件触发频率控制技术,指在事件被触发后再执行回调,若在等待时间内事件,确保连续快速触发时只执行最后一次。

monk all the way 768

详解防抖函数(debounce)和节流函数(throttle)

详解防抖函数(debounce)和节流函数(throttle)

dksks130的博客 1万+

【rk3566/3568】Android 11移植gms

【rk3566/3568】Android 11移植gms 1、前言 测试功能时,想去Google play store去下个应用测试,发现通过网页搜索总是下载不到正确的谷歌服务框架;于是就不得不去搞一个内置的gms。 2、移植 1、需要下载Android 11对应的gms的包 opengapps 2、看下文件目录 直接移植core里面的文件,GAPPs Optional按需添加 3、在vendor下创建google目录 ...

lin_ff的博客 7649

手把手教你实现一个防抖函数(debounce)

闭包不另开一篇文章讲解是讲不完的,并且阮一峰阮大的闭包讲解的已经很好了,我就不献丑了) 对于现在的场景简单来说,你可以这样理解。那么我们的 防抖 函数在这里的作用其实就是帮你把这个函数包装一下的意思,它并不会直接影响这个函数的内部逻辑,就像你的礼物包装一层包装纸🎁后,它本身是没有发生任何变化的。我仅仅只是想最后搜索 hanzhenfang 这几个关键词,但是我在输入每一个字符的时候,都会去后端请求一次,数据量小还好,如果数据量过大的话,由于前几次的请求都是毫无意义的,势必会造成性能和资源上的浪费。

fang_my的博客 6710

【UOJ170】Picks loves segment tree VIII

【题目链接】 点击打开链接 【前置阅读】 【BZOJ4695】最假女选手 【BZOJ3064】【TYVJ1518】CPU监控【UOJ169】【UR #11】元旦老人与数列 【思路要点】 前置阅读中的前两题中,我们分别对线段树的区间取最大/最小值和线段树的历史最大/最小值进行了研究。本题中,两类问题同时出现,因此我们

cz_xuyixuan的博客 1256

ICG cell如何通过Latch结构消除与门clock gating中的glitch?

本文深入解析了ICG Cell如何利用Latch结构解决传统与门时钟门控中的毛刺问题。通过将电平敏感锁存器与门控与门结合,ICG Cell将使能信号的变化严格限制在时钟低电平的安全窗口内采样和锁存,从而在时钟有效沿期间提供稳定的控制信号,从根本上消除了因信号延迟不同步而产生的glitch,确保了门控时钟的纯净与电路功能的可靠性。

weixin_29234423的博客 472

防抖函数Debounce实现

实现原理就是利用定时器,函数第一次执行时设定一个定时器,之后调用时发现已经设定过定时器就清空之前的定时器,并重新设定一个新的定时器,如果存在没有被清空的定时器,当定时器计时结束后触发函数执行。 手写一个 debounce 防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。 // fn 是需要防抖处理的函数 // wait 是时间间隔 function debounce(fn, wait = 50) { // 通过闭包缓存一个定时器 i

Free雅轩的博客 3100

实战案例:用多智能体系统模拟房地产市场的架构设计

房地产市场是典型的复杂自适应系统:买方纠结“要不要上车”、卖方盘算“挂多少钱能快速成交”、中介忙着“撮合两边赚佣金”、政府琢磨“怎么调政策稳房价”——每一个参与者的微小决策,最终都会汇聚成“房价暴涨”“成交冰点”这样的宏观现象。传统的计量经济学模型(比如线性回归)假设“所有人都是理性人”,但现实中没人能算清所有变量——你可能因为“同事买了学区房”就跟风,也可能因为“怕失业”而放弃买房。这时候,多智能体系统(MAS)

移动开发前沿的博客 1124

debounce防抖函数之lodash

关于防抖函数和节流函数的区别,小白在这里就不介绍了,大佬们们应该都懂得,之前对debounce防抖一直停留在原始的代码阶段,重复频率操作,函数内部取消定时器,新增定时器,这样做,也确实能达到我们预期的一定效果,代码示例如下function debounce(fn, wait, immediate) { let timer = null return function() { let a...

weixin_34082854的博客 3992

【x264编码器】章节1——x264编码流程及基于x264的编码器demo

提供了一种方便的方式来根据指定的配置profile应用相应的设置到 x264 参数结构体上。不同的配置文件类型会对参数结构体进行不同的修改,以满足特定的编码需求。然后是编码器参数,包括帧参考数、最大关键帧间隔、最小关键帧间隔、B 帧数、场景切换阈值等。结构体的成员进行赋值,将其初始化为默认值。之后是一些编码器设置,如去块滤波、CABAC 编码、码率控制方法、参考帧压缩系数等。接下来是一系列与视频属性相关的参数,如色度格式、宽度、高度、宽高比等。然后是一些与日志输出、分析类型、量化矩阵等相关的参数。

vcvdv123的博客 5744

28、基准剂量法:原理、应用与计算详解

本文详细介绍了基准剂量法(BMD)的原理、在监管机构中的应用以及具体的计算方法。内容涵盖样本量与BMD的关系、主要监管机构如EPA对BMD的应用、BMD的模型选择与数据拟合过程、拟合优度评估、下置信限(BMDL)计算,以及实验设计对BMD结果的影响。同时,还讨论了剂量指标和响应选择的关键问题,为理解和应用基准剂量法提供了全面的参考。

info6的博客 280

debounce实现 js_深入浅出防抖函数 debounce

引言这一小节会聊聊防抖函数 debounce,结构是一样的,将分别介绍定义、实现原理并给出了 2 种实现代码并在最后介绍在 underscore 中的实现,欢迎大家拍砖。有什么想法或者意见都可以在评论区留言,下图是本文的思维导图,高清思维导图和更多文章请看我的Github。定义及解读防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们...

weixin_35834271的博客 612

JNI的本质解析:Android Framework视角下的Java-Native衔接机制

本文基于Android 14源码深入分析JNI机制,从Android Framework视角解析Java-Native衔接原理。主要内容包括:JNI的双轨制注册机制(静态与动态注册),核心数据结构(JNIEnv与JavaVM)的实现原理,以及完整的调用链路剖析。文章通过MessageQueue的JNI实现案例,展示Android Framework如何利用JNI实现Java层与Native层的高效交互,并提供了性能优化建议。分析表明,JNI作为Android系统架构的关键桥梁,其设计充分考虑了性能、安全性

保持专注,保持热爱 1211

【vue】vue中使用lodash的debounce防抖函数

假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计时 3 秒,直至新的 3 秒内没有函数调用请求,此时执行函数,不然就以此类推重新计时。在上述示例中,debounce函数延迟了searchDebounced方法的执行,1000毫秒内如果有新的输入,将重新计时,直到没有新的输入后触发将要调用的搜索方法xxxx进行实际的搜索操作。在我们项目中可以通过使用防抖函数,节省资源并提高用户体验,避免在频繁触发的事件中重复执行操作。在需要用到的地方进行引用。

m0_69892739的博客 3534

竞赛经验——挑战杯、互联网加、北斗杯、微软创新杯、计算机设计等比赛教训与经验

最近参加一些比赛,北斗杯、挑战者杯、微软创新杯等比赛,每次比赛都有不少需要总结的地方,特别是项目展示上技巧很多,总结一下。 首先最重要的是作品自身硬!自身的作品完成度不高,或者是没有创新点,就没必要参加了。 比如是出去比赛的话,我反正每次碰到最多的是智慧农场、智慧家居之类,不知道为啥这种的太多了。如果是创业型比赛,评委基本会问小米已经做得很好了很便宜了,你的优势在哪里?这些都是常见的问题提前要...

沉迷单车的追风少年 7329

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

debounce防抖函数的使用

debounce防抖函数的使用 说明: 1.首页有30多张图片,每次图片加载完都要执行一个refresh的函数,由于执行次数过多,对refresh函数进行防抖 2.图片位于组件goodsitem.vue中,需要发送事件给home.vue 步骤: 1. 创建一个utils.js文件封装debounce函数 //func为要执行的函数(要防抖的),delay为防抖的毫秒数,在该毫秒数内的函数会被合并掉 export function debounce(func, delay) { let timer = n

weixin_46115860的博客 2629

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

1.防抖函数(debounce)

本文介绍了前端性能优化方法debounce(防抖)的原理与实现。防抖通过setTimeout和clearTimeout控制事件触发,仅在最后一次触发后延迟执行,适用于搜索联想、表单保存等高频场景。文章提供了基础版和进阶版(支持立即执行)的代码实现,并对比了防抖与节流(throttle)的区别。最后给出了TypeScript版本的实现,帮助开发者掌握这一优化技巧,减少不必要的资源消耗。

小彭的博客 2045

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

深入浅出防抖函数 debounce

引言 上一节我们认识了节流函数 throttle,了解了它的定义、实现原理以及在 underscore 中的实现。这一小节会继续之前的篇幅聊聊防抖函数 debounce,结构是一样的,将分别介绍定义、实现原理并给出了 2 种实现代码并在最后介绍在 underscore 中的实现,欢迎大家拍砖。 有什么想法或者意见都可以在评论区留言,下图是本文的思维导图,高清思维导图和更多文章请看我的Github。 #定义及解读 防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只.

chern1992的博客 5657

debounce实现 js_javascript防抖函数debounce详解

定义及解读防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计时 3 秒,直至新的 3 秒内没有函数调用请求,此时执行函数,不然就以此类推重新计时。举一个小例子:假定在做公交车时,司机需等待最后一个人进入后再关门,每次新进一个人,司机就会把计时器清零并重新开始计时,重新等...

weixin_39636696的博客 373

防抖函数-debounce

1. 功能 减少高频率执行代码的执行频率。 2.使用场景 oninput onresize onscroll onmousemove onmousehover 等等 3.防抖原理 3.1 利用 setTimeout 延迟执行逻辑代码。 let timer = null; element2.onkeyup = (event) => { if (timer) { window.clearTimeout(timer); } timer = setTimeout

ZWQ0325的博客 280

防抖debounce函数的基本使用

防抖和节流函数目前已经是前端实际开发中两个非常重要的函数,也是面试经常被问到的面试题,我们会一起来学习防抖和节流函数。coderwhy老师讲的debounce的基本使用,注意这里面有this的绑定与参数的传递。

qq_47230378的博客 2829

使用debounce在react函数组件中做防抖

使用debounce在react函数组件中做防抖 背景 在项目中有这样的常见需求: ​ 提供一个搜索输入框,输入框需要响应用户的输入并且不需要用户点击搜索按钮直接发起搜索。 思路 1. 普通实现 其实这样的需求很常见,也并不难,第一反应就是监听用户输入,只要用户有输入操作立即拿到用户输入的数据直接发起搜索查询 优点:响应迅速,并且确实可以达到需求的效果。 缺点:发送多洗无效请求,浪费服务器的性能资源,增加服务器负担。 2. 防抖函数 使用防抖函数(debounce或者lodash.debounc

Joey_Tribiani的博客 2670

debounce实现 js_【进阶 64 期】深入浅出防抖函数 debounce

戳蓝字「高级前端进阶」关注我们哦!引言 上一节我们认识了节流函数 throttle,了解了它的定义、实现原理以及在 underscore 中的实现。这一小节会继续之前的篇幅聊聊防抖函数 debounce,结构是一样的,将分别介绍定义、实现原理并给出了 2 种实现代码并在最后介绍在 underscore 中的实现,欢迎大家拍砖。有什么想法或者意见都可以在评论区留言,下图是本文的思维导图,高...

weixin_42573113的博客 167

vue中使用loadsh的debounce防抖函数

<s-input placeholder="请输入查询关键字" prefix-icon="magnifier" v-model="content"></s-input> <script> import {debounce} from 'lodash' export default { watch: { cont...

Mybells 4820

debounce防抖函数的使用(js和vue)

debounch防抖函数主要应用场景,解决按钮快速点击,多次请求的问题和input输入框多次请求的问题。接下来直接介绍在js和vue项目中的使用方式。lodash工具库地址:https://lodash.com/docs#debounce 三个参数: _.debounce(func, [wait=0], [options={}]) options有如下三个可选参数配置: leading:指定在延迟开始前是否执行func(默认为false)。 maxWait:设置func...

trigger的博客 4805
上一篇: 有序日期时间字符串转Date
下一篇: 老项目js工具组件
strap
博客等级 码龄3年 60粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值