国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端性能優(yōu)化的利器 ——— 淺談JavaScript中的防抖和節(jié)流

這篇具有很好參考價值的文章主要介紹了前端性能優(yōu)化的利器 ——— 淺談JavaScript中的防抖和節(jié)流。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

防抖和節(jié)流函數(shù)是工作中兩種常用的前端性能優(yōu)化函數(shù),今天我就來總結(jié)一下什么是防抖和節(jié)流,并詳細(xì)說明一下如何在工作中應(yīng)用防抖和節(jié)流函數(shù)

什么是防抖和節(jié)流?

在 JavaScript 中,防抖(debounce)和節(jié)流(throttle)是用來限制函數(shù)執(zhí)行頻率的兩種常見技術(shù)。

防抖(debounce) 是指在某個時間段內(nèi),只執(zhí)行最后一次觸發(fā)的函數(shù)調(diào)用。如果在這個時間段內(nèi)再次觸發(fā)該函數(shù),會重新計時,直到等待時間結(jié)束才會執(zhí)行函數(shù)。
這個技術(shù)通常用于處理頻繁觸發(fā)的事件,比如窗口大小調(diào)整、搜索框輸入等。防抖可以避免函數(shù)執(zhí)行過多次,以減少網(wǎng)絡(luò)開銷和性能負(fù)擔(dān)。

節(jié)流(throttle) 是指在一段時間內(nèi)限制函數(shù)的執(zhí)行頻率,保證一定時間內(nèi)只執(zhí)行一次函數(shù)調(diào)用。無論觸發(fā)頻率多高,都會在指定時間間隔內(nèi)執(zhí)行一次函數(shù)。
這個技術(shù)通常用于處理連續(xù)觸發(fā)的事件,比如滾動事件、鼠標(biāo)移動事件等。節(jié)流可以控制函數(shù)的執(zhí)行頻率,以減少資源消耗和提高性能。

手寫一個防抖的工具函數(shù)

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

函數(shù)說明

  1. 這個防抖函數(shù)接受兩個參數(shù):func表示需要進(jìn)行防抖的函數(shù),delay表示延遲的時間間隔(以毫秒為單位)
  2. 函數(shù)內(nèi)部使用了一個timeoutId變量來保存定時器的標(biāo)識。當(dāng)調(diào)用防抖函數(shù)返回的新函數(shù)時,會清除之前的定時器,并設(shè)置一個新的定時器。只有在延遲時間內(nèi)沒有再次調(diào)用該新函數(shù)時,才會觸發(fā)最終的函數(shù)執(zhí)行

使用示例

該示例表示在全局滾動事件中使用防抖函數(shù),每200毫秒內(nèi)如果觸發(fā)滾動事件,那么不會執(zhí)行handleScroll()函數(shù)。
然后重新計時200毫秒,再次判斷,直到最后一個200毫秒內(nèi)沒有觸發(fā)滾動事件,才會執(zhí)行handleScroll()函數(shù)

function handleScroll() {
  console.log('Scrolled');
}
const debouncedScroll = debounce(handleScroll, 200);
window.addEventListener('scroll', debouncedScroll);

手寫一個節(jié)流的工具函數(shù)

function throttle(func, delay) {
  let timeoutId;
  let lastExecTime = 0;

  return function(...args) {
    const currentTime = Date.now();
    const remainingTime = delay - (currentTime - lastExecTime);

    clearTimeout(timeoutId);

    if (remainingTime <= 0) {
      func.apply(this, args);
      lastExecTime = currentTime;
    } else {
      timeoutId = setTimeout(() => {
        func.apply(this, args);
        lastExecTime = Date.now();
      }, remainingTime);
    }
  };
}

函數(shù)說明

  1. 這個節(jié)流函數(shù)接受兩個參數(shù):func是要執(zhí)行的函數(shù),delay是延遲時間(以毫秒為單位)
  2. 它返回一個新的函數(shù),該函數(shù)在調(diào)用時會根據(jù)指定的延遲時間來限制原始函數(shù)的執(zhí)行頻率

使用示例

在全局滾動事件中使用節(jié)流函數(shù),無論在滾動事件的監(jiān)聽過程中,觸發(fā)了幾次handleScroll()函數(shù),都只會在每200毫秒內(nèi)執(zhí)行一次handleScroll()函數(shù)。

function handleScroll() {
  console.log('Scrolled');
}
const throttledScroll = throttle(handleScroll, 200);
window.addEventListener('scroll', throttledScroll);

如何在工作中應(yīng)用防抖和節(jié)流

防抖和節(jié)流主要應(yīng)用于:搜索框輸入事件監(jiān)聽、窗口大小調(diào)整事件監(jiān)聽、按鈕點擊事件監(jiān)聽、滾動事件監(jiān)聽、鼠標(biāo)移動事件監(jiān)聽等等場景。

工作中哪些場景可以使用防抖函數(shù)?

  1. 用戶輸入: 當(dāng)用戶在表單輸入框中頻繁輸入時,可以使用防抖函數(shù)來延遲處理用戶輸入,避免頻繁的請求或操作,提高性能和用戶體驗。
  2. 搜索框: 在搜索框中,當(dāng)用戶連續(xù)輸入關(guān)鍵字時,可以使用防抖函數(shù)來延遲發(fā)送搜索請求,以避免請求過多。
  3. 窗口調(diào)整: 當(dāng)窗口大小調(diào)整時,會觸發(fā)resize事件,可以使用防抖函數(shù)來限制resize事件的觸發(fā)次數(shù),避免頻繁執(zhí)行調(diào)整相關(guān)的代碼。
  4. 按鈕頻繁點擊: 當(dāng)按鈕被頻繁點擊時,可以使用防抖函數(shù)來限制按鈕點擊的觸發(fā)次數(shù)。

工作中哪些場景可以使用節(jié)流函數(shù)?

  1. 用戶輸入: 當(dāng)用戶在文本框中輸入時,觸發(fā)搜索功能。使用節(jié)流函數(shù)可以限制搜索請求的頻率,以避免頻繁的網(wǎng)絡(luò)請求。例如,可以設(shè)置一個定時器,在用戶輸入后的一小段時間內(nèi)不觸發(fā)搜索請求,只在定時器結(jié)束后才進(jìn)行搜索。
  2. 無限加載: 當(dāng)用戶滾動頁面時,觸發(fā)加載更多數(shù)據(jù)的操作。使用節(jié)流函數(shù)可以限制加載操作的頻率,以提高頁面的響應(yīng)性能。例如,可以設(shè)置一個定時器,在用戶滾動過程中只觸發(fā)加載操作的最后一次滾動事件。
  3. 按鈕頻繁點擊: 當(dāng)用戶頻繁點擊某個按鈕時,觸發(fā)某個操作。使用節(jié)流函數(shù)可以限制點擊操作的頻率,以避免重復(fù)操作或者混亂的界面狀態(tài)。例如,可以設(shè)置一個定時器,在用戶點擊后的一小段時間內(nèi)不觸發(fā)重復(fù)操作。

如何使用loadsh.js工具庫中的防抖和節(jié)流函數(shù)

實際開發(fā)過程中,我們的項目中可能會直接使用loadsh.js工具庫,來避免重復(fù)造輪子,所以這里也特地說明一下如何使用loadsh.js工具庫中的防抖和節(jié)流函數(shù)

  1. 安裝loadsh.js工具庫
npm install lodash  
  1. 在項目中引入loadsh.js工具庫,不同前端項目引入方式不同,請自行鑒別
import { debounce, throttle } from 'loadsh';
  1. 使用防抖函數(shù),該示例中,submitData()函數(shù)被限制為每1秒只會執(zhí)行最后一次,如果在等待時間內(nèi)多次調(diào)用該函數(shù),則會重置1秒的等待時間
// 定義要延遲執(zhí)行的函數(shù)
function submitData(data) {
  console.log('保存數(shù)據(jù):', data);
}

// 使用debounce函數(shù)創(chuàng)建一個延遲執(zhí)行的函數(shù)
const debouncedFn = _.debounce(submitData, 1000);

// 模擬連續(xù)觸發(fā)保存數(shù)據(jù)的操作
// 等待1秒后,只會執(zhí)行最后一次保存數(shù)據(jù)的操作
debouncedFn('數(shù)據(jù)1'); // 不會輸出
debouncedFn('數(shù)據(jù)2'); // 不會輸出
debouncedFn('數(shù)據(jù)3'); //  輸出 —— 保存數(shù)據(jù):數(shù)據(jù)3

  1. 使用節(jié)流函數(shù),該示例中,throttledFn()函數(shù)被限制為每秒只能執(zhí)行一次,如果在等待時間內(nèi)多次調(diào)用該函數(shù),則不會執(zhí)行
// 定義要減少調(diào)用次數(shù)的函數(shù)
function fetchData(data) {
	console.log('拉取數(shù)據(jù):', data);
}

// 使用throttle函數(shù)創(chuàng)建一個定時執(zhí)行的函數(shù)
const throttledFn = _.throttle(fetchData, 2000);

// 調(diào)用throttledFn函數(shù)
throttledFn('數(shù)據(jù)1'); // 輸出 —— 拉取數(shù)據(jù): 數(shù)據(jù)1

// 在1秒內(nèi)多次調(diào)用throttledFn函數(shù)
throttledFn('數(shù)據(jù)2'); // 不會輸出

// 2秒后再次調(diào)用throttledFn函數(shù)
setTimeout(() => {
  throttledFn('數(shù)據(jù)3'); // 輸出 —— 拉取數(shù)據(jù): 數(shù)據(jù)3
}, 1000);

我是 fx67ll.com,如果您發(fā)現(xiàn)本文有什么錯誤,歡迎在評論區(qū)討論指正,感謝您的閱讀!
如果您喜歡這篇文章,歡迎訪問我的 本文github倉庫地址,為我點一顆Star,Thanks~ ??
轉(zhuǎn)發(fā)請注明參考文章地址,非常感謝?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-623587.html

到了這里,關(guān)于前端性能優(yōu)化的利器 ——— 淺談JavaScript中的防抖和節(jié)流的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 在JavaScript中的防抖函數(shù) - 通過在React中構(gòu)建自動完成功能來解釋

    在JavaScript中的防抖函數(shù) - 通過在React中構(gòu)建自動完成功能來解釋

    當(dāng)你將一個新應(yīng)用推向生產(chǎn)環(huán)境時,你希望確保它用戶友好。網(wǎng)站的性能是用戶體驗的關(guān)鍵部分。每個用戶都希望網(wǎng)站及其內(nèi)容能夠快速加載。每一秒都是寶貴的,可能導(dǎo)致用戶再也不會訪問你的網(wǎng)站。 在本指南中,我們將了解JavaScript中一個非常重要的技術(shù),即防抖函數(shù)。

    2024年02月19日
    瀏覽(41)
  • 前端(八)——深入探索前端框架中的Diff算法:優(yōu)化視圖更新與性能提升

    前端(八)——深入探索前端框架中的Diff算法:優(yōu)化視圖更新與性能提升

    ??博主:小貓娃來啦 ??文章核心: 深入探索前端框架中的Diff算法:優(yōu)化視圖更新與性能提升 前端框架中的diff算法是一種比較兩個虛擬DOM樹之間差異的算法。在更新頁面時,為了提高性能,前端框架通常會先生成新的虛擬DOM樹,然后通過diff算法比較新舊虛擬DOM樹的差異,

    2024年02月16日
    瀏覽(16)
  • RDMA性能優(yōu)化經(jīng)驗淺談

    RDMA性能優(yōu)化經(jīng)驗淺談

    首先我們介紹一下RDMA的一些核心概念,當(dāng)然了,我并不打算寫他的API以及調(diào)用方式,我們更多關(guān)注這些基礎(chǔ)概念背后的硬件執(zhí)行方式和原理,對于這些原理的理解是能夠?qū)懗龈咝阅躌DMA程序的關(guān)鍵。 Memory Region RDMA的網(wǎng)卡(下文以RNIC指代)通過DMA來讀寫系統(tǒng)內(nèi)存,由于DMA只能根

    2024年02月10日
    瀏覽(26)
  • 掌握前端利器:JavaScript頁面渲染高階方法解析與實戰(zhàn)

    前端開發(fā)中,頁面渲染的速度和質(zhì)量是衡量一個開發(fā)者水平的重要標(biāo)準(zhǔn)。而在眾多的前端技術(shù)中,JavaScript以其強(qiáng)大的頁面渲染能力獨占鰲頭。本文將深入探討JavaScript在頁面渲染中的應(yīng)用,并通過實例展示其高階方法,旨在幫助讀者更好地掌握前端技術(shù)。 JavaScript在頁面渲染中

    2024年02月10日
    瀏覽(35)
  • 達(dá)夢8數(shù)據(jù)庫性能優(yōu)化思路淺談

    達(dá)夢8數(shù)據(jù)庫性能優(yōu)化思路淺談

    ? ? 作為一名DBA,SQL優(yōu)化是我們工作中必不可少的技能,在投產(chǎn)的系統(tǒng)中,存在大量的SQL語句需要我們分析和快速做出處理。很是考驗我們的經(jīng)驗。這些慢SQL的原因有很多,有SQL編碼不規(guī)范,設(shè)計有缺陷,SQL場景未考慮全面,數(shù)據(jù)量未評估等,預(yù)先需要建立索引的表而未設(shè)計建

    2024年02月06日
    瀏覽(22)
  • Golang 程序性能優(yōu)化利器 PGO 詳解(一):簡單介紹及使用

    在軟件開發(fā)過程中,性能優(yōu)化是不可或缺的一部分。無論是在Web服務(wù)、數(shù)據(jù)處理系統(tǒng)還是實時通信中,良好的性能都是至關(guān)重要的。Golang 從1.20版版本開始引入的?Profile Guided Optimization(PGO)機(jī)制能夠幫助更好地優(yōu)化 Go 程序的性能。 編譯器在編譯程序的時候會對程序做很多優(yōu)

    2024年02月13日
    瀏覽(19)
  • Golang 程序性能優(yōu)化利器 PGO 詳解(二):收集樣本數(shù)據(jù)和編譯

    在軟件開發(fā)過程中,性能優(yōu)化是不可或缺的一部分。無論是在Web服務(wù)、數(shù)據(jù)處理系統(tǒng)還是實時通信中,良好的性能都是至關(guān)重要的。Golang 從1.20版版本開始引入的 Profile Guided Optimization(PGO)機(jī)制能夠幫助更好地優(yōu)化 Go 程序的性能。 上篇文章講解了 Golang PGO 的概念和使用方法

    2024年02月12日
    瀏覽(18)
  • Go RWMutex:高并發(fā)讀多寫少場景下的性能優(yōu)化利器

    Go RWMutex:高并發(fā)讀多寫少場景下的性能優(yōu)化利器

    原創(chuàng)文章,如需轉(zhuǎn)載請聯(lián)系 作者:陳明勇 公眾號:Go技術(shù)干貨 在這篇文章 Go Mutex:保護(hù)并發(fā)訪問共享資源的利器 中,主要介紹了 Go 語言中互斥鎖 Mutex 的概念、對應(yīng)的字段與方法、基本使用和易錯場景,最后基于 Mutex 實現(xiàn)一個簡單的協(xié)程安全的緩存。而本文,我們來看看另

    2023年04月09日
    瀏覽(27)
  • JavaScript 性能優(yōu)化

    優(yōu)化JavaScript代碼的性能是開發(fā)過程中的一個關(guān)鍵任務(wù),它可以顯著提升網(wǎng)站或應(yīng)用的用戶體驗。以下是一些優(yōu)化技巧,涵蓋了減少重繪、減少內(nèi)存占用和合并網(wǎng)絡(luò)請求等方面: 1. **減少重繪和重排:** ? ?- **使用 CSS3 動畫:** 避免使用 JavaScript 實現(xiàn)簡單動畫,盡量使用 CSS3

    2024年02月12日
    瀏覽(35)
  • 前端面試:【性能優(yōu)化】頁面加載性能、渲染性能、資源優(yōu)化

    嗨,親愛的前端開發(fā)者!在今天的Web世界中,用戶期望頁面加載速度快、交互流暢。因此,前端性能優(yōu)化成為了至關(guān)重要的任務(wù)。本文將探討三個關(guān)鍵方面的性能優(yōu)化:頁面加載性能、渲染性能以及資源優(yōu)化,以幫助你構(gòu)建更快速、響應(yīng)更快的Web應(yīng)用程序。 1. 頁面加載性能:

    2024年02月11日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包