”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > JavaScript 中的去抖与节流:何时以及为何应该使用它们

JavaScript 中的去抖与节流:何时以及为何应该使用它们

发布于2024-11-02
浏览:290

Debouncing vs Throttling in JavaScript: When and Why You Should Use Them

JavaScript 非常适合让您的 Web 应用程序变得动态和交互,但它本身无法很好地处理一件事:频繁的事件。考虑诸如调整窗口大小、滚动和在搜索框中键入等操作。如果管理不当,这些事件触发器可能会淹没您的应用程序,从而减慢速度并造成缓慢的用户体验。这就是去抖动节流的用武之地。这些技术可以帮助您控制执行某些功能的频率,从而使您的应用程序保持快速和响应能力。

在本文中,我们将分解去抖动节流,向您展示何时使用它们,并提供真实的示例来查看它们的实际效果。让我们深入研究这些基本的 JavaScript 性能优化技术!

什么是去抖动?

它是如何运作的

将反跳想象为等待某人说完然后你才开始回复。如果你曾经在一次谈话中有人不断打断你,你就会明白了! debouncing 的关键概念是,它延迟函数的执行,直到自上次触发事件以来经过指定的时间。

简单来说,如果一个事件(如用户打字)持续快速发生,去抖动可确保相关功能(如搜索查询)仅在用户停止指定时间段后执行。

何时使用去抖

当您想要限制由于频繁的用户输入而导致的过多函数调用时,您应该使用去抖动。一个典型的例子是,当您有一个搜索框并希望在用户每次键入时进行 API 调用。如果没有去抖,每次击键都会调用 API,从而在服务器上造成不必要的负载。通过去抖,只有当用户停止输入时才会调用 API。

代码中的去抖动

function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => func.apply(this, args), delay);
    };
}

// Usage
const searchInput = document.getElementById('search');
searchInput.addEventListener('input', debounce(() => {
    console.log('API call made!');
}, 300)); // Only executes 300ms after the last keystroke

在此示例中,debounce 函数确保 API 调用仅在用户停止键入后 300 毫秒发生。

什么是节流?

它与去抖有何不同

现在,我们来谈谈节流。如果去抖动等待直到喋喋不休才做出响应,那么节流就像一个交通警察,每隔几秒钟只让一辆车通过,无论有多少辆车在等待。它确保每个设定周期最多调用一次函数,即使事件被重复触发。

何时使用节流

当您需要确保随着时间的推移保持一致的执行时,您将需要使用限制。例如,当用户向下滚动页面时,滚动事件每秒可以触发数十次。如果没有限制,您的应用程序在尝试处理所有这些事件时可能会变慢。限制限制了滚动事件处理程序的执行频率,从而提高了性能。

代码中的节流

函数节流阀(func, limit) { 让最后的调用= 0; 返回函数(...args){ const now = Date.now(); if (现在 - LastCall >= 限制) { 上次通话=现在; func.apply(this, args); } }; } // 用法 window.addEventListener('滚动', 油门(() => { console.log('滚动事件!'); }, 1000)); // 最多每1000ms执行一次
function throttle(func, limit) {
    let lastCall = 0;
    return function(...args) {
        const now = Date.now();
        if (now - lastCall >= limit) {
            lastCall = now;
            func.apply(this, args);
        }
    };
}

// Usage
window.addEventListener('scroll', throttle(() => {
    console.log('Scroll event!');
}, 1000)); // Executes at most once every 1000ms

这里,throttle 函数确保滚动事件处理程序仅每 1000 毫秒执行一次,确保您的应用程序不会被淹没。

现实世界的例子

让我们将这些技术应用到更实际的环境中。假设您正在构建一个

React 应用程序,用户可以在搜索框中输入内容。您可以对输入事件进行去抖处理,以防止 API 调用淹没您的服务器。或者,如果您要跟踪用户在页面上滚动的距离,则可以使用限制来优化性能。

React 中的去抖动

从'react'导入{useState}; 函数搜索组件(){ const [查询,setQuery] = useState(''); const handleSearch = debounce((值) => { // 使用值调用 API console.log('正在搜索:', value); }, 300); 返回 ( { setQuery(e.target.value); handleSearch(e.target.value); }} /> ); }
function throttle(func, limit) {
    let lastCall = 0;
    return function(...args) {
        const now = Date.now();
        if (now - lastCall >= limit) {
            lastCall = now;
            func.apply(this, args);
        }
    };
}

// Usage
window.addEventListener('scroll', throttle(() => {
    console.log('Scroll event!');
}, 1000)); // Executes at most once every 1000ms

限制滚动事件

从'react'导入{useEffect}; 函数 ScrollTracker() { 使用效果(()=> { const handleScroll = 油门(() => { console.log('滚动...'); }, 1000); window.addEventListener('滚动',handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, []); return
滚动查看节流效果!
; }
function throttle(func, limit) {
    let lastCall = 0;
    return function(...args) {
        const now = Date.now();
        if (now - lastCall >= limit) {
            lastCall = now;
            func.apply(this, args);
        }
    };
}

// Usage
window.addEventListener('scroll', throttle(() => {
    console.log('Scroll event!');
}, 1000)); // Executes at most once every 1000ms

性能优化的最佳实践

去抖与节流:何时选择

这是一个快速的经验法则:

    当您想要等到用户停止执行某些操作时,去抖是完美的选择。例如,在搜索栏中输入时。
  • 当您想要确保随着时间的推移保持一致、定期执行时,限制效果最好。它非常适合滚动或调整窗口大小。
当您知道正在处理的事件类型及其触发频率时,您可以为工作选择正确的技术。

结论

控制JavaScript中的频繁事件对于优化性能至关重要,

去抖动节流都提供了强大的解决方案。通过了解何时使用每种方法,您可以使您的 Web 应用程序更加流畅、响应更快,无论是处理搜索输入、调整窗口大小还是管理滚动事件。

下次当您发现您的应用程序因太多事件而陷入困境时,问问自己:

我应该去抖还是限制?你会很高兴你这么做了!

准备好尝试一下了吗?下次您处理项目时,请尝试一下这些技术。您会惊讶地发现一切都变得更加顺畅!

版本声明 本文转载于:https://dev.to/paharihacker/debouncing-vs-throttling-in-javascript-when-and-why-you-should-use-them-1l09?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Item 避免使用其他类型更合适的字符串
    Item 避免使用其他类型更合适的字符串
    1。避免使用字符串替代其他数据类型: 字符串旨在表示文本,但经常被误用来表示数字、枚举或聚合结构。 如果数据本质上是数字,请使用 int、float 或 BigInteger 等类型,而不是 String。 String age = "30"; // incorreto int age = 30;...
    编程 发布于2024-11-02
  • 如何使用sync.WaitGroup防止Go并发死锁?
    如何使用sync.WaitGroup防止Go并发死锁?
    解决 Goroutines 死锁在这种情况下,您在 Go 并发代码中遇到了死锁错误。让我们深入研究这个问题并提供一个有效的解决方案。该错误是由于生产者和消费者的行为不匹配而发生的。在生产者函数中实现的生产者在有限的时间内在通道 ch 上发送值。然而,存在于主函数中的消费者无限期地运行,无休止地尝试从...
    编程 发布于2024-11-02
  • 如何处理文本文件中的 Unicode 文本:无错误编写的完整指南
    如何处理文本文件中的 Unicode 文本:无错误编写的完整指南
    文本文件中的 Unicode 文本:无错写作综合指南从 Google 文档中提取的编码数据可能具有挑战性,尤其是当遇到需要转换为 HTML 使用的非 ASCII 符号时。本指南提供了处理 Unicode 文本并防止编码错误的解决方案。最初,在数据检索期间将所有内容转换为 Unicode 并将其写入文...
    编程 发布于2024-11-02
  • EchoAPI 与 Insomnia:结合实例进行综合比较
    EchoAPI 与 Insomnia:结合实例进行综合比较
    作为一名全栈开发人员,我知道拥有一流的工具来调试、测试和记录 API 是多么重要。 EchoAPI 和 Insomnia 是两个出色的选项,每个选项都有自己独特的特性和功能。让我带您了解这些工具,比较它们的功能和优点,给您一些实际示例,并帮助您决定何时使用 EchoAPI 或 Insomnia。 ...
    编程 发布于2024-11-02
  • 出发时间和持续时间|编程教程
    出发时间和持续时间|编程教程
    介绍 本实验旨在测试您对 Go 的时间和持续时间支持的理解。 时间 下面的代码包含如何在 Go 中使用时间和持续时间的示例。但是,代码的某些部分丢失了。您的任务是完成代码,使其按预期工作。 Go编程语言基础知识。 熟悉 Go 的时间和持续时间支持。 $ go run...
    编程 发布于2024-11-02
  • 起重面试问答
    起重面试问答
    1. JavaScript 中什么是提升? 答案: 提升是执行上下文创建阶段为变量和函数分配内存的过程。在此过程中,为变量分配了内存,并为变量分配了值 undefined。对于函数,整个函数定义存储在内存中的特定地址,并且对其的引用放置在该特定执行上下文中的堆栈上。 ...
    编程 发布于2024-11-02
  • 了解 JavaScript 中的文档对象模型 (DOM)
    了解 JavaScript 中的文档对象模型 (DOM)
    你好,神奇的 JavaScript 开发者? 浏览器提供了一个称为文档对象模型 (DOM) 的编程接口,它允许脚本(特别是 JavaScript)与网页布局进行交互。网页的文档对象模型 (DOM) 是一种分层树状结构,它将页面的组件排列成对象,由浏览器在加载时创建。借助此范例,文档...
    编程 发布于2024-11-02
  • 开始使用 SPRING BATCH 进行编程
    开始使用 SPRING BATCH 进行编程
    Introduction Dans vos projets personnels ou professionnels, Il vous arrive de faire des traitements sur de gros volumes de données. Le traite...
    编程 发布于2024-11-02
  • 使用 CSS 让您的 Github 个人资料脱颖而出
    使用 CSS 让您的 Github 个人资料脱颖而出
    以前,自定义 Github 个人资料的唯一方法是更新图片或更改名称。这意味着每个 Github 配置文件看起来都一样,自定义它或脱颖而出的选项很少。 从那时起,您可以选择使用 Markdown 创建自定义部分。您可以包括您的简历、您的兴趣和爱好,让您的个人资料反映您的身份。这是任何人在访问您的个人资...
    编程 发布于2024-11-02
  • TypeScript 实用程序类型:增强代码可重用性
    TypeScript 实用程序类型:增强代码可重用性
    TypeScript 提供内置实用程序类型,允许开发人员有效地转换和重用类型,使您的代码更加灵活和 DRY。在本文中,我们将探讨关键实用程序类型,例如 Partial、Pick、Omit 和 Record,以帮助您将 TypeScript 技能提升到新的水平。 Partial:使所有属性可选 部分实...
    编程 发布于2024-11-02
  • 电报 window.open(url, &#_blank&#);在ios上工作很奇怪
    电报 window.open(url, &#_blank&#);在ios上工作很奇怪
    我正在制作一个电报机器人,我想添加将一些信息从小型应用程序转发到聊天的选项。我决定使用 window.open(url, '_blank');在我在 iPhone 上尝试之前它一直运行良好。我没有转发,而是分享(这是一件大事,我正好需要转发一条消息)。我有一些如何处理它的想法,但它们...
    编程 发布于2024-11-02
  • 谁是前端开发人员?
    谁是前端开发人员?
    当今互联网上每个网站或平台的用户界面部分都是前端开发人员工作的结果。他们参与创建用户友好的界面,确保网站的外观和功能。但到底谁是前端开发人员呢?我简单解释一下。 用户看到的部分是前端 打开网站时首先看到的是网页界面:颜色、按钮、文字、动画。这都是由前端开发人员创建的。前端是网站或应用...
    编程 发布于2024-11-02
  • 如何使用保留的 CSS 样式将 HTML 内容另存为 PDF?
    如何使用保留的 CSS 样式将 HTML 内容另存为 PDF?
    使用 CSS 将 HTML 内容保存为 PDF在 Web 开发中,即使将内容导出为不同格式,保持视觉美观也至关重要。当尝试将 HTML 元素另存为 PDF 时,这可能会带来挑战,因为 CSS 样式可能会在转换过程中丢失。对于必须在保存的 PDF 中保留 CSS 的情况,请考虑使用以下方法:创建新窗口...
    编程 发布于2024-11-02
  • 为什么使用 Print_r() 时要向 DateTime 对象添加幻像属性?
    为什么使用 Print_r() 时要向 DateTime 对象添加幻像属性?
    Print_r() 更改 DateTime 对象Print_r() 向 DateTime 对象添加属性,从而在调试期间启用自省。此行为是 PHP 5.3 中引入的内部功能的副作用,它将幻像公共属性分配给转储到文本的实例。要避免这些属性引起的错误,请改用反射。然而,不建议寻找这些属性,因为它们没有在类...
    编程 发布于2024-11-02
  • C 语言的数据结构和算法:适合初学者的方法
    C 语言的数据结构和算法:适合初学者的方法
    在 C 语言中,数据结构和算法用于组织、存储和操作数据。数据结构:数组:有序集合,使用索引访问元素链表:通过指针链接元素,支持动态长度栈:先进后出 (FILO) 原则队列:先进先出 (FIFO) 原则树:分级组织数据算法:排序:按特定顺序排序元素搜索:在集合中查找元素图形:处理节点和边之间的关系实战...
    编程 发布于2024-11-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3