告别页面卡顿:一文讲透前端防抖与节流的核心原理

举报
小草飞上天 发表于 2026/09/06 20:42:45 2026/09/06
【摘要】 在日常的 Web 开发中,我们经常会遇到一些高频触发的事件,比如浏览器窗口的 resize、页面的 scroll 滚动,或者是搜索框的 input 输入。如果每次事件触发都直接去执行对应的业务逻辑(比如发送网络请求、重新计算页面布局),极易导致浏览器卡顿甚至崩溃。为了解决这个问题,前端诞生了两个极其重要的性能优化手段:防抖(Debounce)和节流(Throttle)。一、 防抖(Debou...

在日常的 Web 开发中,我们经常会遇到一些高频触发的事件,比如浏览器窗口的 resize、页面的 scroll 滚动,或者是搜索框的 input 输入。如果每次事件触发都直接去执行对应的业务逻辑(比如发送网络请求、重新计算页面布局),极易导致浏览器卡顿甚至崩溃。

为了解决这个问题,前端诞生了两个极其重要的性能优化手段:防抖(Debounce)和节流(Throttle)

一、 防抖(Debounce):等一等再执行

核心思想:在事件被触发后,不立即执行回调,而是等待一段时间。如果在这段时间内事件又被触发了,就重新计时。只有当这段时间内事件没有被再次触发,才真正执行回调。

生活场景:就像坐电梯,只要有人进来,电梯就会重新开门等待,直到一段时间内没人进来了,电梯门才会关上并运行。

应用场景:搜索框输入联想、表单实时校验、窗口大小改变后的重新渲染。

核心代码实现

function debounce(func, wait) {
    let timeout;
    return function (...args) {
        // 如果之前有定时器,先清除掉,重新计时
        clearTimeout(timeout);
        timeout = setTimeout(() => {
            func.apply(this, args);
        }, wait);
    };
}

二、 节流(Throttle):按固定频率执行

核心思想:规定在一个单位时间内,回调函数只能被执行一次。如果在这个单位时间内触发了多次事件,只有第一次会生效,后续的都会被丢弃。

生活场景:就像地铁发车,不管站台上挤了多少人,地铁都是每隔固定的 5 分钟发一趟,不会因为人多就提前发车。

应用场景:滚动加载更多数据、鼠标拖拽时的位置更新、防止按钮被连续点击。

核心代码实现

function throttle(func, wait) {
    let lastTime = 0;
    return function (...args) {
        const now = Date.now();
        // 只有距离上次执行的时间超过了设定的间隔,才允许执行
        if (now - lastTime >= wait) {
            func.apply(this, args);
            lastTime = now;
        }
    };
}

三、 总结

简单来说,防抖是把多次触发合并为最后一次执行,而节流是保证在一段时间内只执行一次

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。