讲师中心 微信公众号
AI工具推荐 视频效率加速

如何防抖和节流javascript_它们能优化哪些性能问题【教程】

夜芳姑娘_4825

夜芳姑娘_4825

发布时间:2026-01-22 16:38:02

|

220人浏览过

|

来源于php中文网

原创

防抖适合用户操作有收尾意图的场景,如搜索输入完成、窗口调整结束,核心是等待停顿后执行最后一次;节流适用于需稳定频率响应的场景,如滚动计算可视区、拖拽更新位置,本质是固定间隔最多执行一次。

如何防抖和节流javascript_它们能优化哪些性能问题【教程】

防抖和节流不是“万能优化”,它们只在特定场景下有效——比如高频事件(resize、scroll、input)触发的重复计算或请求。用错地方反而引入延迟或丢失逻辑,先明确这点再动手。

防抖(debounce)适合什么场景?

用户操作有“收尾意图”的时候才执行,比如搜索框输入完成、窗口调整结束。核心是「等停顿」。

  • debounce 会忽略中间所有调用,只保留最后一次触发后的延迟执行
  • 典型错误:给按钮点击加防抖——用户点一下没反应,体验崩坏
  • 常见漏掉的参数:immediate 控制是否立即执行第一次(比如希望输入即查,但后续停顿才查),不传默认为 false
  • 示例中别直接写 setTimeout 闭包嵌套三层,用函数工厂更清晰:
function debounce(fn, delay, immediate = false) {
  let timer = null;
  return function(...args) {
    const callNow = immediate && !timer;
    clearTimeout(timer);
    if (callNow) fn.apply(this, args);
    timer = setTimeout(() => {
      if (!immediate) fn.apply(this, args);
      timer = null;
    }, delay);
  };
}

节流(throttle)什么时候必须用?

需要“稳定频率”响应,而不是“等停顿”。比如滚动时实时计算可视区域、拖拽时更新位置、Canvas 动画帧同步。

  • 节流本质是「固定间隔最多执行一次」,有两种主流实现:定时器版(setTimeout)和时间戳版(Date.now())
  • 定时器版可能丢帧(最后一次触发若没到间隔就被清空,就不执行了);时间戳版更可靠,但首次调用立刻执行
  • 别把节流当防抖用:比如给 input 加节流,用户快速打字会明显卡顿或漏字符
  • 注意 this 和参数透传——箭头函数会丢失 this,必须用 fn.apply(this, args)

为什么原生事件监听里直接写逻辑会出问题?

浏览器对 scroll 或 resize 的触发频率极高(每秒几十次),每次触发都执行 DOM 查询、计算、重排,CPU 占用飙升,页面直接卡死。

react-best-practices
react-best-practices

重要:对 React 或 Next.js 代码的任何更改必须先阅读本技能。Vercel 工程团队的 React 与 Next.js 指南,涵盖可视化...

下载

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

  • 没包装的 addEventListener('scroll', handleScroll) 是性能黑洞,尤其在移动端
  • Chrome DevTools 的 Performance 面板里能看到大量 Layout 和 Recalculate Style 堆积,这就是典型信号
  • 防抖/节流只是第一层——如果 handleScroll 本身还在反复查 offsetTop 或 getBoundingClientRect(),照样慢
  • 进阶做法:配合 IntersectionObserver 替代 scroll 监听可见性,或用 requestIdleCallback 把非关键计算延后

容易被忽略的兼容性和边界问题

防抖节流函数看似简单,但上线后常因环境差异翻车。

  • IE 不支持 ...args 扩展运算符,需用 arguments 兼容(或直接上 Babel)
  • 移动端 touchmove 触发频率比 scroll 还高,但某些安卓 WebView 里 preventDefault 会影响节流行为
  • 函数被多次绑定(比如组件重复挂载)会导致多个独立 timer,互相干扰——务必确保实例唯一,或手动 cancel
  • React 中若在函数组件内定义防抖函数且未用 useCallback 缓存,每次渲染都会新建,防抖失效

真正难的不是写对防抖节流,而是判断该用哪个、用在哪、以及它后面那层逻辑是否也经得起高频考验。

相关文章

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

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

下载

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

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

2606

2023.08.11

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

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

4879

2023.11.06

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

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

3507

2026.03.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5924

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2664

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1692

2025.10.17

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5247

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2308

2023.08.10

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

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

精品课程

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

共58课时 | 12.1万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn