新闻中心

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

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

javascript如何实现防抖与节流?

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

防抖(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 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Angular中父组件异步更新子组件复选框状态的实践指南  顺丰快递查单号物流信息 顺丰快递小程序查询入口  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  夸克浏览器图书入口 夸克手机浏览器阅读入口  UC浏览器网页版登录入口官网 电脑版网址入口  随机参数递归函数的基准调用次数与时间复杂度探究  解决J*aScript中重复选择项的确认对话框显示问题  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  Typer应用中动态命令行参数的解析与处理  解决深度学习模型训练初期异常高损失与完美验证准确率问题  葱吃多了会怎样 葱吃多了会伤胃吗  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  windows10怎么关闭系统提示音_windows10彻底静音设置方法  抖音创作助手登录入口_抖音创作辅助工具官网直达  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  天眼查企业查询官网入口 天眼查官方网页版查询  Go语言HTML解析:利用Goquery精准获取指定元素内容  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  微博网页版直接访问 微博网页版账号管理快速入口  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  AO3镜像入口大全 AO3网页版内容访问全集  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  抖音网页版怎么|直播|_抖音网页版开播操作指南  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  知音漫客官网漫画下载_知音漫客网页版阅读记录  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  jQuery Mask 插件中实现电话号码固定前导零的教程  Python类型检查:优化关联可选属性的Mypy推断策略  抖音从哪里进入网页版_抖音官方入口链接  Tailwind CSS line-clamp 布局问题解析与修复指南  Pygame教程:解决用户输入与游戏状态更新不同步问题  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  将HTML动态表格多行数据保存到Google Sheet的教程  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  在VS Code中配置和运行Dart程序的完整步骤  J*a编写用户注册与登录功能_掌握字符串与验证逻辑  React Router 嵌套组件中 URL 重定向问题的解决方案  QQ官网正版登录链接 QQ在线登录入口最新  Steam官网入口直达 Steam注册及登录步骤  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色 

搜索