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

如何理解JS事件的防抖與節(jié)流?

開(kāi)發(fā) 前端
在平時(shí)的編碼過(guò)程中,當(dāng)紿瀏覽器注冊(cè)一個(gè)時(shí)間,經(jīng)常會(huì)遇到一些執(zhí)行次數(shù)非常頻繁的事件,如scroll,resize等,事件頻繁的執(zhí)行會(huì)導(dǎo)致瀏覽器進(jìn)行大量的計(jì)算而引發(fā)頁(yè)面卡頓假死的情況,為些我們需要通過(guò)一些手段來(lái)解決這個(gè)問(wèn)題,所以就有了防抖和節(jié)流這兩個(gè)技術(shù)。

本文轉(zhuǎn)載自微信公眾號(hào)「新鈦云服」,作者方章和。轉(zhuǎn)載本文請(qǐng)聯(lián)系新鈦云服公眾號(hào)。

在平時(shí)的編碼過(guò)程中,當(dāng)紿瀏覽器注冊(cè)一個(gè)時(shí)間,經(jīng)常會(huì)遇到一些執(zhí)行次數(shù)非常頻繁的事件,如scroll,resize等,事件頻繁的執(zhí)行會(huì)導(dǎo)致瀏覽器進(jìn)行大量的計(jì)算而引發(fā)頁(yè)面卡頓假死的情況,為些我們需要通過(guò)一些手段來(lái)解決這個(gè)問(wèn)題,所以就有了防抖和節(jié)流這兩個(gè)技術(shù)。

事件節(jié)流 throttle

是指在某段時(shí)間內(nèi),不管你觸發(fā)了多少次回調(diào)事件,我都只認(rèn)第一次,并在計(jì)時(shí)結(jié)束時(shí)給予響應(yīng),至于后面你再觸發(fā)多少次回調(diào)我都不會(huì)予以回應(yīng)。代碼實(shí)現(xiàn)如下:

  1. // fn執(zhí)行的函數(shù), interval是時(shí)間間隔的閾值, 意為多久后執(zhí)行,單位毫秒 
  2. function throttle(fn, interval) { 
  3. // 上一次觸發(fā)回調(diào)的時(shí)間 
  4. let last = 0 
  5.   
  6. return function () { 
  7.     let context = this 
  8.     let args = arguments 
  9.     let now = +new Date() 
  10.       
  11.     // 判斷上次觸發(fā)的時(shí)間和本次觸發(fā)的時(shí)間差是否小于設(shè)置的間隔時(shí)間 
  12.     if (now - last >= interval) { 
  13.     // 如果時(shí)間間隔大于我們?cè)O(shè)定的時(shí)間間隔閾值,則執(zhí)行回調(diào) 
  14.         last = now; 
  15.         fn.apply(context, args); 
  16.     } 
  17.   } 
  18. // 紿scroll事件增加節(jié)流 
  19. const newScroll = throttle(() => console.log('滾動(dòng)了'), 1000) 
  20. document.addEventListener('scroll', newScroll) 

事件防抖Debounce

與事件節(jié)流怡好相反,事件防抖只認(rèn)最后一次,不管你前面觸發(fā)了多少次我都不管,我只執(zhí)行你最后一次觸發(fā)事件的回調(diào),代碼實(shí)現(xiàn)如下:

  1. // fn執(zhí)行的函數(shù), delay是延遲多久執(zhí)行的時(shí)間, 意為多久后才觸發(fā)事件,單位毫秒 
  2. function debounce(fn, delay) { 
  3. let timer = null 
  4. return function () { 
  5.   let context = this 
  6.   let args = arguments 
  7.   // 每次事件被觸發(fā)時(shí),都去清除之前的舊定時(shí)器 
  8.   if(timer) { 
  9.       clearTimeout(timer) 
  10.   } 
  11.   timer = setTimeout(function () { 
  12.     fn.apply(context, args) 
  13.   }, delay) 
  14. const newScroll = debounce(() => console.log('滾動(dòng)了'), 1000) 
  15. document.addEventListener('scroll', newScroll) 

函數(shù)防抖的應(yīng)用場(chǎng)景

連續(xù)的事件,只需觸發(fā)一次回調(diào)的場(chǎng)景有:

搜索框搜索輸入。只需用戶(hù)最后一次輸入完,再發(fā)送請(qǐng)求

手機(jī)號(hào)、郵箱驗(yàn)證輸入檢測(cè)

窗口大小Resize。只需窗口調(diào)整完成后,計(jì)算窗口大小。防止重復(fù)渲染。

函數(shù)節(jié)流的應(yīng)用場(chǎng)景

間隔一段時(shí)間執(zhí)行一次回調(diào)的場(chǎng)景有: 

  • 滾動(dòng)加載,加載更多或滾到底部監(jiān)聽(tīng)
  • 百度搜索框,搜索聯(lián)想功能
  • 高頻點(diǎn)擊提交,表單重復(fù)提交

 

責(zé)任編輯:武曉燕 來(lái)源: 新鈦云服
相關(guān)推薦

2023-12-18 07:37:17

JavaScript防抖節(jié)流

2023-12-21 08:51:37

防抖節(jié)流Vue.js

2021-11-19 09:01:09

防抖節(jié)流前端

2022-04-01 07:52:42

JavaScript防抖節(jié)流

2024-10-12 09:33:24

消息隊(duì)列多線(xiàn)程并行編程

2024-03-08 08:26:20

防抖節(jié)流delay?

2022-02-22 08:29:59

Vue前端防抖

2021-05-27 09:00:00

Node.js開(kāi)發(fā)線(xiàn)程

2022-05-15 22:08:58

ReactHookdebounce

2021-12-13 07:50:14

前端性能優(yōu)化

2017-04-25 16:20:10

頁(yè)面優(yōu)化滾動(dòng)優(yōu)化

2024-06-14 09:30:58

2024-01-05 08:49:15

Node.js異步編程

2024-05-28 09:26:46

2016-10-20 19:07:10

Javascript事件冒泡與捕獲

2017-08-16 10:36:10

JavaScriptNode.js事件驅(qū)動(dòng)

2024-07-01 08:27:05

KeyAndroid按鍵事件

2024-08-29 15:26:21

2024-06-25 08:43:25

C#編程模型

2021-12-09 10:57:19

防抖函數(shù) Debounce
點(diǎn)贊
收藏

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