自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

什么是防抖和節(jié)流?有什么區(qū)別?如何實(shí)現(xiàn)?

開發(fā) 前端
func?是要執(zhí)行的函數(shù),delay?是防抖或節(jié)流的時(shí)間間隔。調(diào)用debounce或throttle函數(shù)并傳入事件處理函數(shù)和時(shí)間間隔,返回一個(gè)新的函數(shù),用于包裹原事件處理函數(shù)。

防抖和節(jié)流在平時(shí)開發(fā)過程中用到還是很多的,兩種常用的優(yōu)化前端性能的技術(shù)。所以平時(shí)的面試過程中也可能會(huì)被問到。防抖和節(jié)流用于限制事件的觸發(fā)頻率,防止事件處理函數(shù)過于頻繁地執(zhí)行,從而提高頁面性能和用戶體驗(yàn)。

1. 防抖(Debouncing):

防抖是指在事件被觸發(fā)后,等待一定的時(shí)間間隔(如1000毫秒),如果在這個(gè)時(shí)間間隔內(nèi)沒有再次觸發(fā)該事件,那么就執(zhí)行事件處理函數(shù);如果在這個(gè)時(shí)間間隔內(nèi)再次觸發(fā)了該事件,則重新等待一定的時(shí)間間隔。

防抖適用于需要等待一段時(shí)間后執(zhí)行事件處理函數(shù)的情況,如搜索框輸入時(shí)的自動(dòng)搜索。

2. 節(jié)流(Throttling):

節(jié)流是指在一定的時(shí)間間隔內(nèi),只允許事件處理函數(shù)執(zhí)行一次。即如果在這個(gè)時(shí)間間隔內(nèi)多次觸發(fā)了該事件,只有第一次觸發(fā)會(huì)執(zhí)行事件處理函數(shù),其他的觸發(fā)會(huì)被忽略。

節(jié)流適用于需要控制事件觸發(fā)頻率的情況,如頁面滾動(dòng)時(shí)的懶加載圖片。

區(qū)別:

  • 時(shí)間點(diǎn)不同: 防抖是在最后一次觸發(fā)事件后等待一段時(shí)間后執(zhí)行事件處理函數(shù);而節(jié)流是在一定的時(shí)間間隔內(nèi)執(zhí)行事件處理函數(shù)。
  • 執(zhí)行頻率不同: 防抖在事件頻繁觸發(fā)時(shí),只會(huì)執(zhí)行一次事件處理函數(shù);而節(jié)流在一定的時(shí)間間隔內(nèi)會(huì)執(zhí)行多次事件處理函數(shù),但是每次執(zhí)行的時(shí)間間隔是固定的。

如何實(shí)現(xiàn):

防抖實(shí)現(xiàn):

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

節(jié)流實(shí)現(xiàn):

function throttle(func, delay) {
  let canRun = true;
  return function(...args) {
    if (!canRun) return;
    canRun = false;
    setTimeout(() => {
      func.apply(this, args);
      canRun = true;
    }, delay);
  };
}

在以上代碼中,func是要執(zhí)行的函數(shù),delay是防抖或節(jié)流的時(shí)間間隔。調(diào)用debounce或throttle函數(shù)并傳入事件處理函數(shù)和時(shí)間間隔,返回一個(gè)新的函數(shù),用于包裹原事件處理函數(shù)。

防抖的使用場景:

  1. 搜索框輸入: 當(dāng)用戶在搜索框中輸入內(nèi)容時(shí),不希望每輸入一個(gè)字母就立即觸發(fā)搜索請求,而是希望等待用戶停止輸入一段時(shí)間后再觸發(fā)搜索請求,以減少請求次數(shù)和提升用戶體驗(yàn)。
  2. 窗口調(diào)整: 當(dāng)窗口大小調(diào)整時(shí),可能會(huì)觸發(fā)resize事件,但頻繁調(diào)整窗口大小時(shí),可能會(huì)導(dǎo)致頁面性能下降。使用防抖技術(shù)可以確保只有在用戶停止調(diào)整窗口大小后才執(zhí)行相關(guān)處理邏輯。
  3. 提交按鈕點(diǎn)擊: 當(dāng)用戶點(diǎn)擊提交按鈕時(shí),可能會(huì)觸發(fā)多次點(diǎn)擊事件,而服務(wù)器端處理請求可能需要一定時(shí)間。使用防抖可以確保只有在用戶停止點(diǎn)擊按鈕一段時(shí)間后才真正提交請求。

節(jié)流的使用場景:

  1. 頁面滾動(dòng): 當(dāng)用戶滾動(dòng)頁面時(shí),可能會(huì)觸發(fā)scroll事件,但頁面滾動(dòng)時(shí)頻繁觸發(fā)事件處理函數(shù)可能會(huì)導(dǎo)致頁面卡頓。使用節(jié)流技術(shù)可以限制事件處理函數(shù)的執(zhí)行頻率,以提升頁面性能。
  2. 鼠標(biāo)移動(dòng): 當(dāng)用戶移動(dòng)鼠標(biāo)時(shí),可能會(huì)觸發(fā)mousemove事件,但頻繁觸發(fā)事件處理函數(shù)可能會(huì)導(dǎo)致頁面性能下降。使用節(jié)流技術(shù)可以確保只有在一定時(shí)間間隔內(nèi)執(zhí)行事件處理函數(shù)。
  3. 按鈕點(diǎn)擊: 當(dāng)用戶點(diǎn)擊按鈕時(shí),可能會(huì)觸發(fā)多次點(diǎn)擊事件,而按鈕點(diǎn)擊事件處理函數(shù)可能需要一定時(shí)間。使用節(jié)流可以確保在一定時(shí)間間隔內(nèi)只執(zhí)行一次點(diǎn)擊事件處理函數(shù),以避免多次觸發(fā)。

責(zé)任編輯:武曉燕 來源: 海燕技術(shù)棧
相關(guān)推薦

2023-12-18 07:37:17

JavaScript防抖節(jié)流

2022-08-26 16:32:08

云計(jì)算公有云私有云

2022-01-16 07:46:53

SpringDataASSM

2021-12-17 14:40:02

while(1)for(;;)語言

2024-03-05 18:59:59

前端開發(fā)localhost

2022-08-02 08:23:37

SessionCookies

2024-05-27 00:40:00

2022-02-27 15:33:22

安全CASBSASE

2024-09-09 13:10:14

2021-05-16 14:26:08

RPAIPACIO

2020-03-09 20:56:19

LoRaLoRaWAN無線技術(shù)

2022-09-07 18:32:57

并發(fā)編程線程

2020-11-09 14:07:53

PyQtQt編程

2022-06-06 14:53:02

LoRaLoRaWAN

2022-09-08 18:38:26

LinuxWindowsmacOS

2024-04-02 09:17:10

單元測試集成測試

2019-10-28 11:47:15

Docker虛擬機(jī)操作系統(tǒng)

2022-03-16 07:33:40

守護(hù)線程用戶線程語言

2022-08-31 08:33:54

Bash操作系統(tǒng)Linux

2023-12-15 09:21:17

ObjectJavaString
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)