当前位置: 首页 > news >正文

什么是防抖和节流?有什么区别?如何实现?

JavaScript 中防抖和节流的概念

定义

防抖(Debounce)是指当某个事件被触发后,在设定的时间内如果没有再次触发该事件,则执行相应的操作;如果在这段时间内又触发了该事件,则重新计时。
节流(Throttle)则是指在一定时间内只允许某件事情发生一次或者几次,通常用于控制高频事件的触发频率。


区别

特性防抖节流
核心概念延迟一段时间后再执行回调函数,期间多次触发会重置定时器在固定时间段内最多执行一次回调
适用场景用户输入完成后的延迟处理(如搜索框自动补全)、窗口调整完成后触发某些逻辑按钮点击、滚动条监控等需要限制调用次数的场景
触发时机只有最后一次触发才会生效时间段内的第一次或指定周期触发

实现方法

防抖实现

以下是基于 setTimeout 的简单防抖函数实现:

function debounce(func, delay) {let timer;return function (...args) {clearTimeout(timer);timer = setTimeout(() => func.apply(this, args), delay);};
}

此代码片段中,每次调用返回的新函数都会清除之前的定时器,并设置一个新的定时器。

节流实现

以下是基于时间戳的节流函数实现:

function throttle(func, limit) {let lastFunc;let lastRan;return function () {const context = this;const args = arguments;if (!lastRan) {func.apply(context, args);lastRan = Date.now();}else {clearTimeout(lastFunc);lastFunc = setTimeout(function () {if ((Date.now() - lastRan) >= limit) {func.apply(context, args);lastRan = Date.now();}}, limit - (Date.now() - lastRan));}};
}

在此代码中,只有当前时间和上次运行时间之间的差值大于等于设定的阈值时才执行函数。


示例代码对比

防抖示例

假设有一个按钮点击事件,我们希望用户停止连续点击一秒之后再执行相应动作:

<button id="debounceBtn">Click Me</button>
<script>const button = document.getElementById('debounceBtn');function handleClick() {console.log('Button clicked!');}button.addEventListener('click', debounce(handleClick, 1000)); // 设置防抖时间为1秒
</script>
节流示例

对于鼠标滚轮事件,我们可以限制每秒钟最多触发一次:

<div style="height: 200vh;">Scroll me!</div>
<script>window.addEventListener('scroll', throttle(() => {console.log('Scrolled!');}, 1000)); // 设置节流时间为1秒
</script>

对比表格

属性防抖节流
目标确保事件结束后的一段时间内仅执行一次控制单位时间内某一事件的最大执行次数
典型应用场景文本输入框中的实时查询、浏览器窗口大小改变页面无限加载、拖拽过程中计算位置
性能影响更适合减少不必要的重复请求更适合降低高频率事件对系统的压力
首次触发行为不立即响应立即响应
最终触发行为如果持续触发不会被执行即使持续触发也会按设定间隔执行

栗子总结
在这里插入图片描述

相关文章:

  • 新闻媒体发稿:社会实践返家乡主题如何选择
  • jvm对象压缩
  • 【工具变量】地级市健康城市试点政策数据集(2007-2024年)
  • web基础
  • 系统架构设计(十五):质量效用树
  • unipp === 状态管理 Pinia 使用
  • Mermaid 使用快速入门
  • MinerU可视化界面程序部署(Windows环境)
  • RSA加解密实战指南:Java与JavaScript实现详解 + 在线工具推荐
  • 探索付费社群的成功之道:生财与群响的深度解析
  • Pandas:Series和DataFrame的概念、常用属性和方法
  • 【漫话机器学习系列】270.KNN算法(K-Nearest Neighbors)
  • 【python进阶知识】Day 31 文件的规范拆分和写法
  • 工业数据治理标准规范深度解析
  • 150.WEB渗透测试-MySQL基础(五)
  • JAVA打飞机游戏设计与实现(论文+源代码)【源码+文档+部署】
  • Splitpanes (可调整大小的面板分割布局)插件应用
  • ALSA 插件是什么? PortAudio 断言失败是什么意思?
  • (05)数字化转型之生产制造:从通常的离散制造到柔性化生产的全景指南
  • 计算机视觉与深度学习 | PSO-MVMD粒子群算法优化多元变分模态分解(Matlab完整代码和数据)
  • 为配合铁路建设,上海地铁3号线将在这两个周末局部缩时运营
  • 中国华能:1-4月新能源装机突破1亿千瓦,利润总额再创新高
  • 西安集中整治监督教育领域不正之风和腐败问题,举报方式公布
  • 又是“9+2”复式票,浦东退休阿姨擒大乐透1153万头奖
  • 重庆对外经贸学院通报:一学生在体育课后不慎坠入化粪池,不幸遇难
  • 广州某科技公司遭网络攻击,境外“黑手”被锁定