全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

J*ascript如何实现防抖与节流?

防抖是最后一次触发后延迟执行,节流是固定间隔内最多执行一次;防抖适用于搜索输入等需等待操作结束的场景,节流适用于滚动监听等需稳定采样节奏的场景。

javascript如何实现防抖与节流?

防抖和节流是前端处理高频事件(比如 resize、scroll、input)的两个核心优化手段,目的都是减少函数实际执行次数,但逻辑不同:防抖是“等你停了再执行”,节流是“固定频率执行”。

防抖(Debounce):最后一次触发后延迟执行

适用于搜索框输入联想、窗口大小调整后重新布局等场景——用户连续操作时,只响应最后那次。

关键点:每次触发都清除之前的定时器,重新设置新定时器。

  • 用 setTimeout + clearTimeout 实现
  • 支持立即执行模式(首次触发立刻运行,后续触发按规则等待)
  • 注意 this 和参数的正确传递

基础实现:

立即学习“J*a免费学习笔记(深入)”;

function debounce(func, wait, immediate = false) {
  let timeout;
  return function(...args) {
    const later = () => {
      timeout = null;
      if (!immediate) func.apply(this, args);
    };
    const callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(this, args);
  };
}

节流(Throttle):固定间隔内最多执行一次

适合滚动监听、鼠标拖拽等需要持续反馈但不必每帧都处理的场景——像“每隔 100ms 最多执行一次”。

关键点:区分“定时器控制”和“时间戳控制”两种主流写法,前者更常用且易于理解。

  • 定时器版:用 setTimeout 控制是否处于“冷却中”
  • 时间戳版:记录上一次执行时间,当前时间减去它大于等待时间才执行
  • 两者在首次/末次触发行为上略有差异,可根据需求选择

定时器版节流示例:

Blackink AI纹身生成 Blackink AI纹身生成

创建类似纹身的设计,生成独特纹身

Blackink AI纹身生成 80 查看详情 Blackink AI纹身生成
function throttle(func, wait) {
  let timeout = null;
  return function(...args) {
    if (!timeout) {
      timeout = setTimeout(() => {
        func.apply(this, args);
        timeout = null;
      }, wait);
    }
  };
}

实际使用中的细节提醒

防抖和节流函数返回的是新函数,需在事件绑定时调用并赋值,而不是直接传入函数名。

  • 错误写法:input.addEventListener('input', debounce(handleInput, 300)) —— 每次都会新建闭包,失去防抖意义
  • 正确写法:const debounced = debounce(handleInput, 300); input.addEventListener('input', debounced)
  • 记得在组件卸载或销毁时清除定时器(尤其 React useEffect 中),避免内存泄漏
  • 现代项目可借助 Lodash 的 _.debounce / _.throttle,它们已处理好 this、取消、返回清理函数等细节

如何选?看业务意图

用户输入搜索关键词 → 防抖(等他打完再查)

监听页面滚动位置做吸顶效果 → 节流(不需要每像素都算,16ms 一帧足够)

表单实时校验 → 防抖(避免用户还没输完就报错)

游戏手柄方向监听 → 节流(保持稳定采样节奏)

基本上就这些。不复杂但容易忽略上下文和清理逻辑。

以上就是J*ascript如何实现防抖与节流?的详细内容,更多请关注其它相关文章!


# 绑定  # 酒店网站建设方案模板  # 柳州去哪找智能营销推广  # 外贸社媒推广营销  # 南昌seo优化诊断  # 新乡外贸网站优化费用低  # 个人博客网站推广问题  # 佳木斯seo营销推荐  # 黄山网络推广营销公司  # 中山推广营销技术  # seo 网络 培训视频  # 的是  # 有什么区别  # 如何使用  # react  # 首次  # 如何实现  # 表单  # 适用于  # 最多  # 防抖  # ai  # 联想  # app  # 前端  # java  # javascript 


相关文章: Lar*el Eloquent:基于关联关系是否存在进行父模型过滤与删除  提升Kafka消费者健壮性:会话超时处理与消息处理语义  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  从OpenAI API响应中高效提取生成文本  反效果?《战地6》免费试玩开启后玩家数不升反降  将JSON对象数组转置为键值对列表的实用指南  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  UC浏览器网页版登录入口官网 电脑版网址入口  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  离线运行Go语言之旅:本地部署与GOPATH配置指南  excel怎么提取文本中数字 excel函数提取技巧  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  Go语言:非阻塞式判断标准输入(os.Stdin)是否有数据  python3时间如何用calendar输出?  可靠CSGO开箱平台解析 CSGO开箱网合集  mysql如何分析事务日志_mysql事务日志分析方法  React Router v6 教程:构建认证保护的私有路由与重定向策略  Archive of Our Own官网直达 AO3最新可用地址一览  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  BetterDiscord插件中安全更新用户简介的实践指南  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  优化Django表单:提交验证失败后保留用户输入  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  服务端验证_j*ascript输入检查  学习通网页版官方登录 超星学习通电脑端入口指南  在Qt QML中通过Python字典动态更新TextEdit内容的教程  CSS子选择器:如何区分并样式化嵌套列表的子层级  必由学登录入口 必由学官方网站在线访问链接  Django表单验证失败时保留用户输入数据的最佳实践  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  Centos/Linux 系统下安装 composer 的完整步骤  如何使用纯J*aScript判断Input元素是否在特定类容器内  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  深入理解与实现最大堆的Heapify过程:常见错误与修正  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  Python模块化编程:有效管理依赖与避免循环引用  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  铁路12306的积分有效期是多久_铁路12306积分有效期说明 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。