JavaScript中什么是防抖与节流_它们适用于哪些场景

轻瑶大大_1557

轻瑶大大_1557

2026-01-01

303人浏览

原创

防抖是将多次高频事件合并为最后一次执行,核心是每次触发清除前次定时器;节流是固定间隔最多执行一次,需区分“等待中”和“可执行”状态。

javascript中什么是防抖与节流_它们适用于哪些场景

防抖(debounce)是什么,怎么写一个可靠版本

防抖是指将多次高频触发的事件,合并为最后一次执行。典型场景是用户在搜索框中输入时,不希望每按一次键就发请求,而是等他停顿下来再查。

关键点在于:每次新触发都会清除前一次的定时器,只保留最后一次的延迟执行。

  • setTimeout 必须被 clearTimeout 清除,否则会累积多个未执行定时器
  • 需要返回函数,方便绑定事件或手动调用
  • 推荐支持立即执行模式(immediate = true),即首次触发立刻执行,后续触发仍按防抖逻辑处理
function debounce(func, wait, immediate = false) {
  let timeout;
  return function(...args) {
    const later = () => {
      timeout = null;
      if (!immediate) func(...args);
    };
    const callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func(...args);
  };
}

节流(throttle)和防抖的区别在哪

节流是固定时间间隔内最多执行一次,不管触发多频繁。适用于监听滚动、鼠标移动这类持续高频但只需“采样”的场景。

常见错误是把节流写成“每次触发都重设定时器”,结果变成变相防抖;正确做法应区分“正在等待”和“可立即执行”两种状态。

  • 使用时间戳方式:记录上次执行时间,当前时间减去它大于等于 wait 才执行
  • 使用定时器方式:设置一个标志位,触发时若无定时器则启动,执行完再清空
  • 时间戳方式更简单,但首次触发立即执行;定时器方式可控制首次是否延后
function throttle(func, wait) {
  let previous = 0;
  return function(...args) {
    const now = +new Date();
    if (now - previous > wait) {
      func(...args);
      previous = now;
    }
  };
}

哪些场景该选防抖,哪些必须用节流

选错策略会导致交互卡顿或数据丢失。核心判断依据是:你关心的是“最终状态”还是“过程变化频率”。

shopify-app-react-router
shopify-app-react-router

构建 Shopify 嵌入式应用(Embedded App)的开发技能:基于 @shopify/shopify-app-react-router + React Router v7 + Admin API 2026-04。覆盖 shopifyApp 配置、authenticate.admin 的 GraphQL/REST 调用、Webhook 校验、Session 存储、订阅计费、App Bridge 导航、部署,并新增:适用场景判断、安全最佳实践、错误处理与容错、最佳实践、常见问题 FAQ、高级场景。G

下载
  • 防抖适用:input 搜索、resize 窗口调整后重新布局、表单校验(用户输完再提示)
  • 节流适用:scroll 计算可视区域、mousemove 绘图/拖拽反馈、无限滚动加载更多(不能等用户停下才加载)
  • 特别注意:scroll 和 resize 在 Chrome 中可能每秒触发上百次,不用节流或防抖极易导致页面卡死

现代开发中要不要自己手写

Lodash 的 debounce 和 throttle 已经非常稳定,支持取消(cancel)、刷新(flush)等扩展能力,日常开发优先直接引入。

但手写仍有价值:调试时能看清执行路径;某些轻量项目不想引入依赖;面试中考察对异步与闭包的理解深度。

  • 注意浏览器原生的 requestIdleCallback 或 IntersectionObserver 可替代部分节流需求(如懒加载)
  • Vue/React 中封装成 Hook 或 Composable 更自然,但底层逻辑仍是上述两种模式之一
  • 移动端触摸事件(touchmove)比 mousemove 更频繁,节流阈值建议设为 16ms(接近 60fps)而非默认 100ms

防抖和节流不是“加了就稳”,它们改变的是函数执行时机,稍不注意就会让 UI 响应变迟钝,或者漏掉关键状态。真正难的从来不是实现,而是判断某次 scroll 是该节流、防抖,还是干脆换用 IntersectionObserver。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

3006

5

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.06

6279

7

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

2026.03.24

4487

22

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

2025.07.29

5213

19

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.24

974

4

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

60

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

140

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.6万人学习