前端性能优化---防抖与节流--02

防抖(Debounce)和节流(Throttle)是两种常用的优化技术,主要用于控制高频率的事件触发,如滚动、输入、窗口调整大小等。本文将深入探讨防抖与节流的原理、实现方法及其应用场景。

简单场景就是:输入框防抖,滚动节流

1. 防抖(Debounce)

防抖是一种在事件频繁触发时,通过延迟执行来减少事件触发次数的技术。防抖的核心思想是:当事件被触发时,不立即执行处理函数,而是设置一个定时器,如果在定时器未结束前再次触发事件,则重新开始计时。这样可以确保在一定时间内只执行一次事件处理函数。

实现原理:

复制代码
function debounce(func, wait) {
    let timeout;
    return function(...args) {
        const context = this;
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(context, args), wait);
    };
}

示例应用:

在搜索框输入时,实时发送请求获取搜索建议。如果不进行防抖处理,每次输入都会发送请求,造成服务器压力和资源浪费。通过防抖可以优化这种场景:

复制代码
const searchInput = document.getElementById('search');
const handleSearch = debounce((event) => {
    console.log('Fetching search results for:', event.target.value);
    // 发送搜索请求
}, 300);

searchInput.addEventListener('input', handleSearch);

2. 节流(Throttle)

节流是一种在事件频繁触发时,通过限制函数执行频率来减少事件处理次数的技术。节流的核心思想是:在规定的时间间隔内只执行一次事件处理函数,不论期间事件触发了多少次。

实现原理:

复制代码
function throttle(func, limit) {
    let inThrottle;
    return function(...args) {
        const context = this;
        if (!inThrottle) {
            func.apply(context, args);
            inThrottle = true;
            setTimeout(() => inThrottle = false, limit);
        }
    };
}

示例应用:

在页面滚动时,实时计算滚动位置以显示回到顶部按钮。如果不进行节流处理,滚动事件会频繁触发,导致性能问题。通过节流可以优化这种场景:

复制代码
const handleScroll = throttle(() => {
    console.log('Scroll position:', window.scrollY);
    // 处理滚动事件
}, 200);

window.addEventListener('scroll', handleScroll);

3. 防抖与节流的选择

防抖和节流虽然都是用于控制高频事件,但它们的应用场景有所不同:

  • 防抖:适用于频繁触发但只需最后一次结果的场景,如搜索输入、窗口大小调整等。
  • 节流:适用于持续触发但需要定期执行的场景,如滚动事件、窗口滚动位置计算等。

4. 深入优化

立即执行版防抖:

有时我们希望在事件触发时立即执行一次,然后再进行防抖控制,可以在防抖函数中添加一个立即执行选项:

复制代码
function debounce(func, wait, immediate) {
    let timeout;
    return function(...args) {
        const context = this;
        const callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(() => {
            timeout = null;
            if (!immediate) func.apply(context, args);
        }, wait);
        if (callNow) func.apply(context, args);
    };
}

带有标识的节流:

有时我们希望在节流过程中能够获取到当前的状态,可以在节流函数中添加一个标识:

复制代码
function throttle(func, limit) {
    let inThrottle;
    return function(...args) {
        const context = this;
        if (!inThrottle) {
            func.apply(context, args);
            inThrottle = true;
            setTimeout(() => inThrottle = false, limit);
        }
    };
}

5. 综合应用

在实际开发中,防抖与节流可以结合使用。例如在一个实时搜索的页面中,用户输入时进行防抖处理,而在结果展示时进行节流处理,以优化整体性能。

复制代码
const searchInput = document.getElementById('search');
const resultsContainer = document.getElementById('results');

const fetchResults = debounce((query) => {
    console.log('Fetching results for:', query);
    // 模拟搜索请求
    setTimeout(() => {
        resultsContainer.innerHTML = `Results for: ${query}`;
    }, 500);
}, 300);

const handleScroll = throttle(() => {
    console.log('Scroll position:', window.scrollY);
    // 处理滚动事件
}, 200);

searchInput.addEventListener('input', (event) => {
    fetchResults(event.target.value);
});

window.addEventListener('scroll', handleScroll);

防抖与节流是前端性能优化中的两项重要技术,通过合理地应用这两种技术,可以显著减少高频事件带来的性能问题,提升用户体验。其他性能优化技术,如代码分割、异步加载、懒加载等,后续介绍。

相关推荐
要开心吖ZSH14 小时前
处方物流信息同步优化:从 36 秒到亚秒级的踩坑记录
java·数据库·mysql·性能优化
搬砖柯15 小时前
系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照
分布式·测试工具·性能优化·开源·自动化·httpx
云栖梦泽在1 天前
Claude Code / Codex 使用卡顿怎么办?AI 编程 Agent 连接失败与网络排查思路
网络·人工智能·网络协议·chatgpt·性能优化
爱喝水的鱼丶1 天前
SAP-ABAP:接口 vs 抽象类:ABAP OOP两类扩展方式的差异与选型原则
运维·性能优化·sap·abap·erp·经验交流
这是个栗子2 天前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
AI服务老曹2 天前
国产NPU视觉算法参数配置说明
算法·性能优化·边缘计算
大数据002 天前
画像标签系统性能优化:SelectDB 字符串解析函数实战与 Profile 深度剖析
性能优化·doris·selectdb·画像标签
工业HMI实战笔记2 天前
工业HMI界面布局“1核2辅”黄金结构,适配90%场景
前端·ui·性能优化·自动化·交互
ai产品老杨2 天前
多路摄像头AI分析性能优化指南
人工智能·性能优化
黑黑的独立开发笔记2 天前
「 简记往来」第十五篇:小程序性能优化——首屏从2.5秒到1.2秒
性能优化·小程序·首屏优化·分包加载·setdata·简记往来