」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > JavaScript 中的去抖與節流:何時以及為何應該使用它們

JavaScript 中的去抖與節流:何時以及為何應該使用它們

發佈於2024-11-02
瀏覽:466

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如有侵犯,請洽study_golang@163 .com刪除
最新教學 更多>
  • 現在已經九月了嗎?
    現在已經九月了嗎?
    大家早安,MonDEV快樂☕ 我們已經全面回歸,而九月重返 PC 的原因之一就是 Preptember! 那些從早期就開始關注時事通訊的人以及那些關注開源世界的人已經知道了,但在10 月份有一個持續一個月的活動,即Hacktoberfest;如果我們願意的話,我們可以將其定義為開源節,邀請我們所有...
    程式設計 發佈於2024-11-02
  • 為什麼錯誤的 return 語句會導致 for 迴圈中程式過早終止?
    為什麼錯誤的 return 語句會導致 for 迴圈中程式過早終止?
    for 循環中錯誤的返回語句在此編程問題中,用戶在創建允許用戶輸入三種動物的程序時遇到困難。該程式旨在用包含名稱、動物類型和年齡的 Pet 物件填入清單。然而,在輸入第一個動物後,程式突然結束。 經過分析,問題很明顯出在 make_list 函式中 return 語句的位置。 for 迴圈重複實作程...
    程式設計 發佈於2024-11-02
  • 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 的時間和持續時間支援。 $ ...
    程式設計 發佈於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

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3