0

0

javascript如何实现防抖和节流_它们有何区别与用途【教程】

紅蓮之龍

紅蓮之龍

发布时间:2026-01-31 17:50:03

|

962人浏览过

|

来源于php中文网

原创

防抖是“等最后一次”,节流是“固定间隔执行一次”;防抖适用于搜索框输入等需最终状态的场景,节流适用于滚动监听等需过程状态的场景。

javascript如何实现防抖和节流_它们有何区别与用途【教程】

防抖和节流不是“选一个用”,而是解决两类不同触发场景的问题:防抖适合「等用户彻底停手再执行」,节流适合「匀速稳定地响应高频事件」。

防抖(debounce)怎么写才不踩坑

核心是每次触发都清除上一次定时器,只保留最后一次的延时执行。常见错误是没处理 this 和参数透传,或忘记返回函数以便移除监听。

  • 必须用 clearTimeout 清除前序定时器,否则会累积执行
  • func.apply(context, args) 保证原函数的 this 和参数正确传递
  • 若需手动取消(比如组件卸载),得暴露 cancel 方法
  • 立即执行模式(leading edge)要单独判断,不能和 trailing 混在一起

简版实现:

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)为什么常用时间戳+定时器双机制

单靠 setTimeout 容易漏掉最后一次触发;只用时间戳又无法保证「至少执行一次」。双机制能兼顾首尾和均匀性。

立即学习Java免费学习笔记(深入)”;

Sesame AI
Sesame AI

一款开创性的语音AI伴侣,具备先进的自然对话能力和独特个性。

下载
  • 时间戳方案:记录上次执行时间,当前时间减去它 ≥ wait 才执行,执行后更新时间戳
  • 定时器方案:触发时若无 pending 定时器,则设一个,在结束时清空;但可能丢尾
  • 推荐组合:用时间戳控制是否该执行,用定时器兜底保证最终执行(即「有头有尾」)
  • 注意不要在滚动/拖拽中直接用 requestAnimationFrame 替代节流——它不控制频率,只对齐帧率

可靠节流示例(时间戳 + 定时器):

function throttle(func, wait) {
  let previous = 0;
  let timeout = null;
  return function(...args) {
    const now = Date.now();
    if (now - previous >= wait) {
      func.apply(this, args);
      previous = now;
    } else {
      clearTimeout(timeout);
      timeout = setTimeout(() => {
        func.apply(this, args);
        previous = Date.now();
      }, wait);
    }
  };
}

input搜索、窗口缩放、按钮点击该用哪个

选型取决于「用户意图」和「业务语义」,不是看谁更“高级”。

  • input 搜索建议:用防抖(debounce),等用户打完字再发请求,避免中间态浪费 API 调用
  • resizescroll 监听:优先节流(throttle),尤其涉及重排重绘时,需稳定节奏更新 UI
  • 防二次提交按钮:用防抖(debounce),限制「连续点击」,但要注意首次点击必须立刻生效(immediate = true
  • 鼠标拖拽位置上报:节流更稳妥,防抖会导致松手前位置丢失,体验断层

Lodash 的 debouncethrottle 哪些配置容易被忽略

它们默认行为和手写差异不小,尤其在边缘场景下表现不同。

  • leading: true + trailing: false 组合会让防抖变成「首次立即执行,后续只清不延」,容易误以为失效
  • maxWait 是节流的强制上限,即使一直触发,也会在 maxWait 后兜底执行——这点手写常遗漏
  • cancel()flush() 在异步清理或同步触发剩余任务时很关键,但多数人只记得调用主函数
  • Lodash 版本 ≥ 4.0 后,throttle 默认启用 leadingtrailing,意味着首尾都会执行,和纯时间戳手写版行为不一致

真正难的不是写出一个能跑的版本,而是想清楚「这次用户动的是什么,系统该在什么时候、以什么节奏回应」——防抖和节流只是两个杠杆,支点在业务逻辑里。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1446

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

945

2025.04.24

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

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

187

2023.11.24

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

go语言 math包
go语言 math包

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

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号