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

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

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

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]删除
最新教程 更多>
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-04-11
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-04-11
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-04-11
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-04-11
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-04-11
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-11
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头的数组使用curlopt_httpheader选项:响应将存储在变量$ result。示例代码...
    编程 发布于2025-04-11
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-11
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-04-11
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-11
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-04-11
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-04-11
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-11
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-04-11
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-04-11

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

Copyright© 2022 湘ICP备2022001581号-3