(转)轻松理解JS函数节流和函数防抖

uniapp H5刷新页面后返回按钮失效问题完美解决方案 这个问题其实很隐蔽,尤其是uniapp H5 场景下刷新导致栈清理,很多开发者一开始都懵掉了。uniapp 内部对「页面栈只有一个」时的返回逻辑是reLaunch;所以只要在这个分支里替换为自己的逻辑(比如),就能顺利实现预期。目前我在项目里已经跑通了,暂时没发现问题。不得不说,知道源码里这个逻辑后,真的是醍醐灌顶,只能膜拜框架大佬了 🤯。 阅读详情

JS函数防抖和函数节流

  • 问题引入
    问题1: 如果实现了dom拖拽功能,但是在绑定拖拽事件的时候发现每当元素稍微移动一点便触发了大量的回调函数,导致浏览器直接卡死,这个时候怎么办?


  • 问题2:如果给一个按钮绑定了表单提交的post事件,但是用户有些时候在网络情况极差的情况下多次点击按钮造成表单重复提交,如何防止多次提交的发生?

为了应对如上场景,便出现了函数防抖和函数节流两个概念,总的来说:
这两个方法是在时间轴上控制函数的执行次数。

函数防抖(debounce)

概念: 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。
生活中的实例: 如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。

函数节流(throttle)

概念: 规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。
生活中的实例: 我们知道目前的一种说法是当 1 秒内连续播放 24 张以上的图片时,在人眼的视觉中就会形成一个连贯的动画,所以在电影的播放(以前是,现在不知道)中基本是以每秒 24 张的速度播放的,为什么不 100 张或更多是因为 24 张就可以满足人类视觉需求的时候,100 张就会显得很浪费资源。


分析图
假设,我们观察的总时间为10秒钟,规定1秒作为一次事件的最小间隔时间。
如果触发事件的频率是 0.5s/次,那么
函数防抖如图

因为始终没法等一秒钟就被再次触发了,所以最终没有一次事件是成功的。
函数节流如图

因为控制了最多一秒一次,频率为0.5s/次,所以每一秒钟就有一次事件作废。最终控制成1s/次
如果触发事件的频率是 2s/次,那么
函数防抖如图

因为2s/次已经大于了规定的最小时间,所以每计时两秒便触发一次。
函数节流如图

同样,2s/次 大于了最小时间规定,所以每一次触发都生效。
应用场景
对于函数防抖,有以下几种应用场景:

给按钮加函数防抖防止表单多次提交。
对于输入框连续输入进行AJAX验证时,用函数防抖能有效减少请求次数。
判断scroll是否滑到底部,滚动事件+函数防抖

总的来说,适合多次事件一次响应的情况

对于函数节流,有如下几个场景:

游戏中的刷新率
DOM元素拖拽
Canvas画笔功能

总的来说,适合大量事件按时间做平均分配触发。

函数防抖:

function debounce(fn, wait) {
  var timer = null;
  return function () {
      var context = this
      var args = arguments
      if (timer) {
          clearTimeout(timer);
          timer = null;
      }
      timer = setTimeout(function () {
          fn.apply(context, args)
      }, wait)
  }
}
var fn = function () {
  console.log('boom')
}
setInterval(debounce(fn,500),1000) // 第一次在1500ms后触发,之后每1000ms触发一次
setInterval(debounce(fn,2000),1000) // 不会触发一次(我把函数防抖看出技能读条,如果读条没完成就用技能,便会失败而且重新读条)

之所以返回一个函数,因为防抖本身更像是一个函数修饰,所以就做了一次函数柯里化。里面也用到了闭包,闭包的变量是timer。

函数节流

function throttle(fn, gapTime) {
  let _lastTime = null;
  return function () {
    let _nowTime = + new Date()
    if (_nowTime - _lastTime > gapTime || !_lastTime) {
      fn();
      _lastTime = _nowTime
    }
  }
}
let fn = ()=>{
  console.log('boom')
}
setInterval(throttle(fn,1000),10)

如图是实现的一个简单的函数节流,结果是一秒打出一次boom

小结

函数防抖和函数节流是在时间轴上控制函数的执行次数。防抖可以类比为电梯不断上乘客,节流可以看做幻灯片限制频率播放电影。

扩展阅读

Github: JavaScript 函数节流和函数去抖应用场景辨析
SegmentFault:函数节流与函数防抖
Github:函数节流与函数防抖

作者:ACERY1

链接:http://taobaofed.org/blog/2016/08/12/optimized-react-components/

假人有限元模型 假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用 立即下载

相关推荐

新手必看:电路设计里的‘地’到底怎么接?单点、多点、混合接地保姆级图解

本文深入解析电路设计中的接地技术,涵盖单点、多点和混合接地的原理与应用。通过详细的图解和实战案例,帮助新手理解接地在提供参考电位、构成电流回路及抑制电磁干扰中的关键作用,避免常见设计误区,提升电路稳定性与抗干扰能力。

weixin_28455801的博客 298

认识JavaScript中的防抖函数

在JS防抖、节流实现过程中,返回一个函数是为了让其具有更好的通用性和灵活性提示

唐璜Taro的博客 3189

BetaFlight开源飞控源码分析

BetaFlight是穿越机领域比较成熟的开源飞控,本篇文章主要分析一下源代码以及如何使用这个开源代码

weixin_43811044的博客 1万+

函数节流与函数防抖

今天我们来学习函数节流与函数防抖,那为什么要使用函数节流与函数防抖呢?因为某些代码会在没有间断的情况下连续重复执行(例如:滚动条事件,只要滚动条稍稍一变化,那代码就会执行一次) ,这样就会导致效率非常低,为了提高效率就要控制某个函数在一定时间内执行的次数,这就是函数节流与函数防抖的本质。...

weixin_61430914的博客 989

STM32CUBEMX 使用教程5 — DMA配置 & 串口结合DMA实现数据搬运

DMA(Direct Memory Access),直接存储器访问(或数据搬运),是STM32中很实用的一个外设。DMA 传输数据方式不需要 CPU 参与控制传输,也不用中断处理的方式进行数据搬运处理,纯粹通过硬件为 RAM 与 I/O 设备之间开辟一条直接传送数据的通路,使 CPU 的效率大大提高。

weixin_43866583的博客 1499

【数字电源/MATLAB+PLECS】如何进行 Buck 数字电源仿真(二)PLECS 搭建开环 Buck 功率级

本文介绍了如何在PLECS中搭建开环Buck功率级模型,验证数字电源设计的基本思路。重点内容包括: 明确开发顺序:先开环验证功率级,再闭环设计控制器 搭建关键组件:输入电源、PWM模块、MOSFET开关、续流二极管、LC滤波电路及负载 设置初始参数:24V输入、12V输出、200kHz开关频率、22μH电感、100μF电容 测量关键波形:MOSFET Vds验证开关动作、电感电流纹波和输出电压稳态值 提供完整仿真模型和GitHub资源,便于读者复现验证 文章强调通过开环测试先确保功率级正确性,为后续闭环控制

weixin_43234123的博客 1218

JS函数防抖和函数节流

JS函数防抖和函数节流问题引入问题1: 如果实现了dom拖拽功能,但是在绑定拖拽事件的时候发现每当元素稍微移动一点便触发了大量的回调函数,导致浏览器直接卡死,这个时候怎么办?问题2:如果给一个按钮绑定了表单提交的post事件,但是用户有些时候在网络情况极差的情况下多次点击按钮造成表单重复提交,如何防止多次提交的发生?为了应对如上场景,便出现了函数防抖和函数节流两个概念,总的来说:这两个方法是在时间...

忆初 494

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5567

逐步解析防抖与节流

防抖 防抖:事件被触发规定时间后再执行回调,如果频繁触发,则重新计算规定时间 举个生活中的例子,外面很多便利店、酒店、餐厅等都会有自动感应门,人靠近感应门就会触发开门时间,一定时间后就会关门。 假如有家店有个感应门,规定开门5秒后关门,现在陆续有客人进入这家店: 第一批客人要进去,门开了,(5,4,3,2,1)5秒内没有人再进来,门关闭; 第二批客人要进去,门开了,(5,4,3)等到第三秒又有一批客人要进,门没关,而是则重新计算5秒(5,4,3,2),等到第四秒又有一批客人要进,门没关,而是又重新计算时间

ChengNan的博客 541

使用 Python 爬虫抓取 IMDb 电影信息 - 评分、评论与基本信息抓取教程

本文介绍了如何使用 Python 爬虫技术抓取 IMDb 电影评分、评论和基本信息。我们分别展示了通过IMDb API和两种方法抓取数据,并进行了数据存储、分析与可视化。在未来,我们还可以基于这些数据开发电影推荐系统、情感分析工具等,进一步丰富电影数据的应用场景。通过这些实践,您不仅学会了如何抓取和存储数据,还可以通过这些基础来构建自己的数据分析应用,获取更丰富的电影数据。

2201_76125261的博客 601

beegfs源码分析

BeeGFS的客户端是由一个内核模块和两个系统服务组成的,这里咱们主要分析内核模块。由于BeeGFS的目录树解析,是在父目录DEntry里找子目录或文件DEntry,逐级迭代完成的,所以在Mount文件系统时,须要从管理节点获取根元数据节点的ID,而后再向根元数据节点查询根目录的DEntry的信息,为后续的目录解析打下基础。获取类似/data/beeond/data/dentries/38/51/root/#fSiDs#/文件fileId的父路径。1.1 FileID的生成。Session网络消息。

wfzy的博客 1913

【JS-工具类】防抖与节流---在定义时返回的是回调函数

- 防抖:多次触发事件只执行一次 - 管你娘的按多少次,老子只执行最后一此触发 - 节流:一定时间内只执行一次事件 - 你按,你尽管按,诶,我就只按自己的节奏来,任尔东西南北风

m0_61486963的博客 706

【Realtek sdk-3.4.14b】RTL8197FH+RTL8363NB当WAN/LAN IP冲突的时候,再次切换回正常的WAN,出现电脑无法上网也无法ping通设备网关问题分析及解决方案

如上图所示,当WAN和LAN网段冲突的时候,会导致路由设备异常,无法上网,但是修改为不冲突的网段之后,依然无法上网,同时下级PC也无法ping通路由设备,正常的如下图所示如上图所示,正常网络拓扑是可以正常的,但是在上级和路由LAN冲突的时候,再次切换为正常的网络也是异常问题复现步骤1.路由设备WAN口接到一个和本级路由是相同网段的设备2.拔掉WAN口,将WAN口接到一个和本级路由是不同网段的设备3.此时PC无法访问路由器。

wgl307293845的博客 665

轻松理解JS函数节流和函数防抖

JS函数防抖和函数节流 问题引入 问题1: 如果实现了dom拖拽功能,但是在绑定拖拽事件的时候发现每当元素稍微移动一点便触发了大量的回调函数,导致浏览器直接卡死,这个时候怎么办? 问题2:如果给一个按钮绑定了表单提交的post事件,但是用户有些时候在网络情况极差的情况下多次点击按钮造成表单重复提交,如何防止多次提交的发生? 为了应对如上场景,便出现了函数防抖和函数节流两个概念,总的...

arthur09的博客 216

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

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

java接口防抖_彻底弄懂节流和防抖

节流和防抖这两个东西,你肯定听过,就是两种优化浏览器性能的手段。相关文章你肯定也看过,如果还是不太清楚,没关系,看完这篇短文,相信你能轻松理解其中差别。防抖(deounce)我们先说防抖吧,这里有个小笑话,看完你应该就秒懂了:小明军训,教官发令:向左转!向右转!向后转!大家都照着做,唯有小明坐下来休息,教官火的一批,大声斥问他为啥不听指挥?小明说,我准备等你想好到底往哪个方向转,我再转。虽然是个笑...

weixin_30843121的博客 2732

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

php如何做防抖,轻松理解函数防抖和节流的使用

前言函数防抖和节流,这个知识点面试中被问的概率比较高。防抖非立即执行版防抖可以理解为n时间后执行一次函数。立即执行版防抖是立即执行一次函数。防抖的实现/*** @desc 函数防抖* @param {Function} func 函数* @param {Number} wait 延迟执行毫秒数* @param {Boolean} immediate true 表示立即执行,false 表示非立即执...

weixin_42361623的博客 645

数学建模模型总结

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

防抖和节流的简单理解

一、防抖:在规定的时间第n秒后才会执行回调,如果在n秒内又被触发,则会进行重置(重新计时); 应用场景: 登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖; 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖 文本编辑器实时保存,当无任何更改操作一秒后进行保存 //封装防抖函数 function debounce(fn, delay = 1000) { // 定义一个变量 let timer

想好了再写! 882

React Native 鸿蒙跨平台开发:防抖和节流函数代码指南

在展示完整代码之前,我们先深入理解防抖和节流函数实现的核心逻辑,掌握这些核心代码后,你将能够轻松应对各种防抖和节流函数相关的开发需求。,按出现频率排序,问题现象贴合开发实际,解决方案均为「一行代码/简单配置」,所有方案均为鸿蒙端专属最优解,也是本次代码能做到。的核心原因,零基础可直接套用,彻底规避所有防抖和节流函数相关的性能问题、显示异常、交互失效等问题,基于本次的核心防抖和节流函数代码,结合RN的内置能力,可轻松实现鸿蒙端开发中。以下是鸿蒙 RN 开发中实现「防抖和节流函数」的。

gg310773517的博客 979

php如何做防抖,JS的防抖与节流

概念和例子函数防抖(debounce)在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。看一个(栗子)://模拟一段ajax请求function ajax(content) {console.log('ajax request ' + content)}let inputa = document.getElementById('unDebounce')inputa.addEvent...

weixin_39782545的博客 324

JavaScript 防抖节流分不清?这 2 个指令封装好,面试再也不慌

在时间戳方式的节流函数中,我们通过记录上一次函数执行的时间 lastTime,每次事件触发时,获取当前时间 nowTime,如果 nowTime 减去 lastTime 大于设定的间隔时间 interval,就执行函数,并更新 lastTime 为当前时间。定时器方式是通过设置定时器,在定时器到期后执行函数,并清空定时器,在定时器执行期间,不再处理新的事件触发。为了让节流函数既能立即执行,又能在最后一次触发时执行,我们可以综合时间戳和定时器两种方式,实现一个更完善的节流函数:​。

2503_92849134的博客 807

JS-函数防抖与节流学习

前言 函数防抖与节流在许多大厂(比如阿里、字节)面试题中经常有出现,跟随大厂的脚步,在此做一个记录学习备用 正文 防抖(debounce) 字面意思,防止抖动嘛~ 不要让ta随意乱抖,太夸张的动作,物极必反,影响性能。 定义: 任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。就是在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。 举个???? : 比如一个input 搜索框的模糊搜索,每次输入完要请求一次接口,这无疑会对服务器造成压力,所以这里防抖就

qq_33378937的博客 206

使用 javascript 编写 防抖和节流函数

带你轻松理解和实现防抖节流

qq_61233877的博客 171

【节流和防抖】一文轻松理解前端的节流和防抖

大家玩过moba游戏的都知道回城,回城不能被打断,如果打断了需要重新开始进度条等待回城。节流可以类比为游戏的技能冷却,我再怎么点,一段时间内也只能放一次技能。

weixin_62106250的博客 444

函数防抖和函数节流

前言 网上关于防抖节流的文章很多,其中不乏有各位大佬的各种姿势的深入理解,需要自己有一定的基础方可学得轻松一些。对于初次接触或迫切需要此功能的人员来说,可能一段直接复制即可使用的代码就能满足其初体验,用的多了再看下大佬的文章自然也就懂了。 正文 一.函数节流,复制即可使用 <body> <input type="text" id="dev" /> <script> let dev = document.querySelect..

qq_42786958的博客 157

JavaScript原生实战手册 · 防抖节流实现原理:让你的页面性能飞起来

在日常开发中,你是否遇到过这样的问题:用户在搜索框里快速输入时,页面变得卡顿?今天我们就来学习两个性能优化的核心技术——防抖(debounce)和节流(throttle),用原生JavaScript轻松解决这些性能问题。实际上,电梯会等一小段时间(比如10秒),如果这期间没有新的人按按钮,才会关门出发。更重要的是,这些都是用纯原生JavaScript实现的,不需要任何外部依赖,可以放心在任何项目中使用。防抖和节流就是你工具箱中的两把利剑,合理使用它们,让你的页面性能真正"飞起来"!

前端达人 762

前端新人必学:防抖和节流的傻瓜式教程

想象你在坐电梯:当有人连续按电梯按钮时(防抖场景),电梯不会每次按键都响应,而是等最后一个人进入后延迟几秒才关门运行;而在水龙头节流(节流场景)时,无论你如何快速开关,水流都会保持稳定速率流出。对于需要持续运行的演示页面,用平台的一键部署功能就能生成可分享的访问链接,不用自己折腾服务器配置。刚开始可能会觉得这两个概念有点绕,但只要记住:防抖像电梯等人,节流像水龙头限流,多写几个demo就能形成肌肉记忆。现在遇到高频事件处理的场景,我都会条件反射先考虑该用哪种方案,这已经成为前端开发的本能反应了。

BlackironPanther23的博客 699
上一篇: npm安装淘宝镜像
下一篇: 深入理解滚动scroll
buddha_coder
博客等级 码龄9年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值