0

0

什么是javascript防抖与节流_它们如何优化性能?

夢幻星辰

夢幻星辰

发布时间:2026-01-05 17:48:55

|

129人浏览过

|

来源于php中文网

原创

防抖函数能避免高频触发是因为它通过重置定时器实现“等一等”,仅在最后一次触发后延迟执行;节流则通过时间戳或定时器控制“匀速发车”,确保固定间隔执行。

什么是javascript防抖与节流_它们如何优化性能?

防抖(debounce)函数为什么能避免高频触发?

防抖的核心是「等一等」:只要事件持续触发,就不断重置定时器,只在最后一次触发后延迟执行。典型场景是搜索框输入、窗口 resize 监听——用户还没停手,就不急着查 API 或重绘

容易踩的坑:clearTimeout 必须作用于上一次保存的定时器 ID,否则会漏清;且首次调用时 timerId 应为 nullundefined,避免未声明报错。

实操建议:

  • 用闭包保存 timerId,避免全局污染
  • 支持立即执行模式(immediate = true):首次触发立刻运行,后续进入等待状态
  • 注意 this 和参数传递,推荐用 func.apply(this, args) 而非直接调用
function debounce(func, delay, immediate = false) {
  let timerId = null;
  return function(...args) {
    const callNow = immediate && !timerId;
    clearTimeout(timerId);
    timerId = setTimeout(() => {
      timerId = null;
      if (!immediate) func.apply(this, args);
    }, delay);
    if (callNow) func.apply(this, args);
  };
}

节流(throttle)函数怎么保证固定频率执行?

节流是「匀速发车」:无论事件多快,函数最多每隔指定时间执行一次。适用于鼠标拖拽、滚动监听(scroll)、Canvas 动画帧控制等需要稳定节奏的场景。

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

关键区别在于判断逻辑:不能只靠定时器,否则可能因触发间隙短导致漏执行;常见实现分「定时器版」和「时间戳版」,后者更精准但无法保证首次立即执行。

实操建议:

  • 时间戳版节流:记录上次执行时间,每次触发比较 Date.now() - lastTime >= delay
  • 定时器版节流:用 setTimeout 控制「锁定期」,期间忽略新触发,到期后解锁
  • 两者可组合(如 Lodash 的 throttle)支持 leading/trailing 配置,按需启用首尾执行
function throttle(func, delay) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      func.apply(this, args);
      lastTime = now;
    }
  };
}

debounce 和 throttle 在事件绑定中怎么选?

选错会导致功能异常或性能没改善。核心判断依据是「你关心的是最后状态,还是中间过程」。

零沫AI工具导航
零沫AI工具导航

零沫AI工具导航-AI导航新标杆,探索全球实用AI工具

下载

常见错误现象:

  • debounce 处理滚动加载更多 → 滚动停住才请求,用户已划过目标区域,数据没加载出来
  • throttle 处理搜索联想 → 输入停了还继续发请求,浪费带宽且结果滞后

使用场景对照:

  • debounce:输入校验、自动保存草稿、防重复提交(按钮点击)
  • throttle:滚动位置上报、鼠标移动轨迹采样、Canvas 渲染帧率限制

性能影响:两者都减少函数调用次数,但 throttle 可能比 debounce 多执行几次;若 delay 设得过大(如 500ms),throttle 会明显卡顿,而 debounce 只是响应延迟。

实际项目里为什么常要手动清理 debounce/throttle 实例?

组件卸载、事件解绑、对象销毁时,不清理残留的定时器或闭包引用,会造成内存泄漏——尤其在 React/Vue 单页应用中,debounce 函数若被组件方法闭包持有,又没清除 setTimeout,定时器会一直跑,this 指向的旧组件实例也无法 GC。

实操建议:

  • debouncethrottle 返回的函数存在变量里,方便后续 clearTimeout 或设为 null
  • React 中可在 useEffect 的清理函数里调用 cancel(若封装了取消方法)或手动清定时器
  • 不要在每次 render 都新建防抖函数,应提至组件外或用 useCallback 缓存

复杂点在于:节流的时间戳版没有定时器可清,但闭包中的 lastTime 仍会滞留;真正安全的做法是让防抖/节流函数支持 .cancel() 方法,并在销毁时显式调用。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

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

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

152

2025.07.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

6500

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3344

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

1687

2025.12.25

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

550

2023.10.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

热门下载

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

精品课程

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

共42课时 | 9.5万人学习

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

共26课时 | 1.6万人学习

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

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