JavaScript 防抖(Debounce)與節流(Throttle)

????????在 JavaScript 前端開發中,處理高頻率事件(如窗口調整、輸入框輸入、頁面滾動)時,如果不加以控制,會導致性能問題,如頁面卡頓或資源浪費。防抖(Debounce)和節流(Throttle)是兩種優化策略,用于減少事件觸發頻率,提升用戶體驗和性能。

一、防抖(Debounce)詳解

????????防抖的核心思想是:確保事件觸發后,在指定延遲時間內不再觸發新事件,才執行函數。如果延遲時間內再次觸發事件,則重新計時。這避免了連續觸發導致的多次執行,適用于需要“等待用戶停止操作”的場景。

1.原理
防抖基于一個計時器(Timer)機制。當事件首次觸發時,設置一個定時器(延遲時間為 tt 毫秒)。如果在 tt 毫秒內事件再次觸發,則清除之前的定時器并重新設置;只有當 tt 毫秒內無新事件觸發時,定時器到期后函數才執行。數學上,這相當于確保函數只在事件序列的“最后一次”觸發后執行。
例如:用戶輸入搜索框時,防抖確保只在停止

2.實現代碼
以下是 JavaScript 的防抖函數實現(使用 ES6 語法),包含詳細注釋:

/*** 防抖函數實現* @param {Function} fn - 需要防抖的函數* @param {number} delay - 延遲時間(毫秒)* @returns {Function} - 返回一個新的防抖函數*/
function debounce(fn, delay) {let timerId = null; // 用于存儲定時器IDreturn function(...args) {// 如果已有定時器,則清除它(確保只執行最后一次)if (timerId !== null) {clearTimeout(timerId);}// 設置新定時器:延遲時間后執行原函數timerId = setTimeout(() => {fn.apply(this, args); // 使用 apply 確保 this 上下文正確timerId = null; // 執行后重置定時器ID}, delay);};
}// 使用示例
const handleSearch = debounce(function(event) {console.log('Searching:', event.target.value);// 實際應用:發送搜索請求
}, 500); // 延遲500毫秒document.querySelector('#search-input').addEventListener('input', handleSearch);
  • 代碼解釋

    • debounce 函數接收一個函數 fn 和延遲時間 delay

    • 內部使用 setTimeout 管理計時器:每次事件觸發,先清除舊計時器,再設置新計時器。

    • 使用 apply 確保目標函數 fn this 和參數正確傳遞。

    • 示例中,輸入框的 input 事件被防抖處理:用戶停止輸入500毫秒后,才執行搜索邏輯。

3.應用場景

  • 搜索框輸入:用戶輸入停止后執行搜索,避免頻繁請求服務器1

  • 窗口調整(resize):只在用戶停止調整窗口大小時更新布局,減少重繪開銷3

  • 表單驗證:用戶停止輸入后才驗證,而不是每次按鍵都觸發5

  • 按鈕防重復點擊:防止用戶快速多次點擊提交按鈕,導致重復提交4

二、節流(Throttle)詳解

????????節流的核心思想是:在固定時間間隔內,無論事件觸發多少次,只執行一次函數。這保證了函數的執行頻率可控,適用于需要“均勻執行”的場景。

1.原理
節流使用一個時間戳或計時器來控制執行頻率。假設時間間隔為 t?毫秒:當事件首次觸發時,立即執行函數并記錄時間戳;之后每次觸發事件,檢查當前時間與上次執行時間的差值,如果差值小于 t,則忽略;如果大于或等于 t,則執行函數并更新時間戳。數學上,這確保函數在時間軸上的執行間隔至少為 t。
例如:頁面滾動時,節流確保滾動事件每100毫秒只處理一次,保持動畫流暢。

2.實現代碼
以下是 JavaScript 的節流函數實現(使用時間戳方式),包含詳細注釋:

/*** 節流函數實現(時間戳版本)* @param {Function} fn - 需要節流的函數* @param {number} interval - 時間間隔(毫秒)* @returns {Function} - 返回一個新的節流函數*/
function throttle(fn, interval) {let lastExecTime = 0; // 上次執行時間戳return function(...args) {const now = Date.now(); // 當前時間戳// 如果當前時間與上次執行時間差大于間隔,則執行函數if (now - lastExecTime >= interval) {fn.apply(this, args); // 執行函數lastExecTime = now; // 更新上次執行時間}};
}// 使用示例
const handleScroll = throttle(function() {console.log('Scrolling...');// 實際應用:加載更多內容或更新動畫
}, 100); // 每100毫秒最多執行一次window.addEventListener('scroll', handleScroll);
  • 代碼解釋

    • throttle 函數接收一個函數 fn 和時間間隔 interval

    • 使用 Date.now() 記錄時間戳:每次事件觸發,比較當前時間與上次執行時間。

    • 如果時間差超過 interval,則執行函數并更新時間戳;否則忽略。

    • 示例中,滾動事件被節流處理:每100毫秒最多觸發一次,避免頻繁計算。

3.應用場景

  • 頁面滾動(scroll):控制滾動事件處理頻率,優化無限加載或動畫性能。

  • 游戲或動畫控制:確保按鍵事件(如射擊或移動)在固定幀率下執行,避免卡頓。

  • 鼠標移動事件(mousemove):在拖拽操作中,限制更新頻率,提升流暢度。

  • API 請求限流:防止用戶快速點擊導致服務器過載。

三、防抖與節流的區別

防抖和節流都用于優化高頻事件,但核心機制不同:

  • 防抖:側重于“等待穩定狀態”,只在事件停止觸發后執行一次。適合處理突發性連續事件(如輸入框輸入),減少不必要的計算。

  • 節流:側重于“控制執行頻率”,在固定間隔內強制執行一次。適合處理持續性事件(如滾動或動畫),保證流暢性。

簡單對比:

特性防抖(Debounce)節流(Throttle)
核心思想多次觸發,最后一次生效固定時間內只觸發一次
執行時機延遲后執行(等待無新事件)立即或間隔后執行(保證頻率)
適用場景搜索輸入、窗口調整滾動加載、按鈕點擊限流
數學模型函數執行延遲到事件序列末端函數執行間隔?tt?毫秒

四、總結

????????防抖和節流是前端性能優化的核心工具:防抖通過延遲執行減少連續觸發,節流通過頻率控制保證執行效率。正確應用它們能顯著提升頁面響應速度和用戶體驗。在實現時,注意使用 setTimeout 或時間戳管理計時邏輯,并結合實際場景選擇策略。例如,搜索框用防抖,滾動事件用節流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93152.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探索無人機圖傳技術:創新視野與無限可能

近年來,無人機技術的飛速發展不僅改變了航空行業的格局,還深刻影響了多個領域的日常運作。無人機圖傳技術作為無人機的核心技術之一,憑借其精準的圖像傳輸能力和高效的遠程操作特性,正在成為各行各業的得力助手。從空中拍攝到實時…

Comfyui進入python虛擬環境

如果你的 Python 可執行文件(python.exe)位于 C:\comfyui\.venv\Scripts,那么 .venv 本身已經是一個虛擬環境,你只需要 激活它,而無需再創建一個新的虛擬環境。如何激活這個已有的虛擬環境? 1. 打開終端&am…

秋招春招實習百度筆試百度管培生筆試題庫百度非技術崗筆試|筆試解析和攻略|題庫分享

筆試介紹 百度非技術崗筆試采用的是規定時間統一筆試形式,管培生會有兩場考試分別是7月底和8月中旬,其他非技術類崗位一般在8月中旬開始。 行測題必考,有些崗位考簡答題,比如管培生以及產品經理等崗位。 筆試內容 筆試內容一…

低資源語言翻譯:數據增強與跨語言遷移學習策略

文章目錄一、低資源語言翻譯的挑戰1.1 數據稀缺性1.2 語言特性復雜1.3 評估困難二、數據增強策略(Data Augmentation)2.1 基于單語數據的增強2.2 基于平行數據的增強2.3 多模態數據增強三、跨語言遷移學習策略(Cross-Lingual Transfer Learni…

【每天一個知識點】時間序列聚類

一、什么是時間序列聚類?如果把數據比作一本書,那么時間序列(Time Series)就是一本按時間順序記錄事件的日記。它可能是股票每天的價格波動、某臺機器的溫度曲線、一個城市的空氣質量變化,甚至是人的心電信號。時間序列…

對抗損失(GAN)【生成器+判斷器】

這個是啥呢,搞圖片生成用的。我搜了下,把整體流程記錄下,過程中會用到GAN準備數據集(真實圖像素材) 目標生成人臉的,你像游戲注冊時選一個臉。捏臉。那么準備真實人臉圖片老規矩,縮放裁剪…

5分鐘入門C++

這是5分鐘入門 C 的精簡 Demo&#xff0c;盡量涵蓋核心概念&#xff1a;變量、函數、類、控制流、STL 容器&#xff0c;讓你快速理解 C 的基本用法。#include <iostream> // 輸入輸出 #include <vector> // 動態數組 #include <algorithm> // 常用算法…

java注釋功能

為了優化代碼的使用&#xff0c;分享記錄相關注釋功能。 單行注釋 // 這是單行注釋文字多行注釋 /* 這是多行注釋文字 這是多行注釋文字 注意&#xff1a;多行注釋不能嵌套使用。 */文檔注釋 /**- 這是文檔注釋文字- */注釋的作用 描述類或方法的功能&#xff0c;方便別人和自…

(論文速讀)DiffusionDet - 擴散模型在目標檢測中的開創性應用

論文題目&#xff1a;DiffusionDet: Diffusion Model for Object Detection&#xff08;DiffusionDet:物體檢測的擴散模型&#xff09;會議&#xff1a;ICCV2023摘要&#xff1a;我們提出了DiffusionDet&#xff0c;這是一個新的框架&#xff0c;它將物體檢測描述為從噪聲盒到目…

LangChain簡介

LangChain 是一個用于構建基于大語言模型&#xff08;LLM&#xff09;的應用程序的開源框架&#xff0c;它提供了一套工具、組件和接口&#xff0c; 可以將 LLM 模型、向量數據庫、交互層 Prompt、外部知識、外部工具整合到一起&#xff0c;進而可以自由構建 LLM 應用。 LangCh…

為什么哈希表(字典)的查詢速度有時會突然變慢

哈希表&#xff08;在許多語言中被稱為“字典”或“關聯數組”&#xff09;的查詢速度&#xff0c;在理想情況下&#xff0c;應是接近“瞬時”的常數時間&#xff0c;然而&#xff0c;在特定場景下&#xff0c;其性能之所以會突然、無征兆地變慢&#xff0c;其根源&#xff0c;…

whisper 語種檢測學習筆記

目錄 transformers推理&#xff1a; transformers 源代碼 網上的語種檢測調用例子&#xff1a; 語種檢測 api transformers推理&#xff1a; https://github.com/openai/whisper/blob/c0d2f624c09dc18e709e37c2ad90c039a4eb72a2/whisper/decoding.py waveform, sample_rat…

第1節 從函數到神經網絡:AI思路的逆襲之路

&#x1f914; 開篇靈魂拷問 是不是覺得AI知識體系龐大到嚇人&#xff1f;看了一堆快餐視頻還是云里霧里&#xff1f;別慌&#xff01;這個系列就是要幫你打通任督二脈&#xff0c;用"既快又慢、既深入又膚淺、既有趣又嚴肅"的方式講透AI基礎知識&#xff01; &…

【科研繪圖系列】R語言繪制多種餅圖

文章目錄 介紹 加載R包 數據下載 導入數據 數據預處理 畫圖1 畫圖2 畫圖3 畫圖4 畫圖5 畫圖6 系統信息 參考 介紹 【科研繪圖系列】R語言繪制多種餅圖 加載R包 rm(list = ls()) library(ggstatsplot) library(ggplot2) library(plotrix) library(ggpubr

vue3權限樹封裝成組件

vue3權限樹組件 功能&#xff1a; 1、勾選節點、自動把父節點勾選。 2、取消勾選、子節點全部取消勾選。檢查父節點&#xff0c;如果只有這個子節點、遍歷把父節點取消勾選 3、filter過濾不僅展示父節點、相關子節點同時展示 4、 高亮顯示所有過濾數據 效果圖父組件引用 <te…

銓林接紙機學習記錄1

光電開關學習做保養也是檢查這些東西&#xff0c;包括氣路有沒漏氣&#xff0c;固定件松動、軌道清潔之內刀座暫停光電I23刀座行程磁性開關&#xff0c;這個是安全警戒光電&#xff0c;驅動側發射信號&#xff0c;操作側接收刀座暫停光電正常運行是空白的&#xff0c;當出現遮擋…

47.分布式事務理論

所有的事務都必須滿足ACID的原則: 原子性:事務中的所有操作,要么全部成功,要么全部失敗。 一致性:要保證數據庫內部完整性約束、聲明性約束。 持久性:對數據庫做的一切修改將永久保存,不管是否出現故障。 隔離性:對同一資源操作的事務不能同時發生。 分布式事務的…

【軟考】進度管理知識庫工具-挺方便

進度管理知識庫 全面解析項目管理中的進度管理核心概念、工具、技術和最佳實踐&#xff0c;幫助您高效管理項目時間線 六步流程法 規劃進度管理 - 制定進度管理計劃 定義活動 - 識別和記錄項目活動 排列活動順序 - 確定活動間的邏輯關系 估算活動持續時間 - 估算完成單項活動所…

PDF Replacer:高效便捷的PDF文檔內容替換專家

在日常工作和學習中&#xff0c;PDF文件因其格式穩定、兼容性強而被廣泛使用。然而&#xff0c;PDF文件的編輯和修改往往比其他文檔格式更加復雜。PDF Replacer正是為了解決這一痛點而設計的&#xff0c;它是一款方便實用的PDF文檔替換工具&#xff0c;能夠幫助用戶快速替換PDF…

Java中MybatisPlus使用多線程多數據源失效

Java中MybatisPlus使用多線程多數據源失效 文章目錄Java中MybatisPlus使用多線程多數據源失效一&#xff1a;背景二&#xff1a;解決方法三&#xff1a;其他導致DS失效的條件3.1、Transactional一&#xff1a;背景 Mybatis-Plus使用異步任務后不能找到指定設置的DS數據庫&…