成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高頻:手寫一個(gè)節(jié)流函數(shù) Throttle

開發(fā) 前端
比如綁定響應(yīng)鼠標(biāo)移動(dòng)、窗口大小調(diào)整、滾屏等事件時(shí),綁定的函數(shù)觸發(fā)的頻率會(huì)很頻繁。若稍處理函數(shù)微復(fù)雜,需要較多的運(yùn)算執(zhí)行時(shí)間和資源,往往會(huì)出現(xiàn)延遲,甚至導(dǎo)致假死或者卡頓感。為了優(yōu)化性能,這時(shí)就很有必要使用 debounce 或 throttle 了。

[[438987]]

debounce 與 throttle 是開發(fā)中常用的高階函數(shù),作用都是為了防止函數(shù)被高頻調(diào)用,換句話說就是,用來控制某個(gè)函數(shù)在一定時(shí)間內(nèi)執(zhí)行多少次。

使用場景

比如綁定響應(yīng)鼠標(biāo)移動(dòng)、窗口大小調(diào)整、滾屏等事件時(shí),綁定的函數(shù)觸發(fā)的頻率會(huì)很頻繁。若稍處理函數(shù)微復(fù)雜,需要較多的運(yùn)算執(zhí)行時(shí)間和資源,往往會(huì)出現(xiàn)延遲,甚至導(dǎo)致假死或者卡頓感。為了優(yōu)化性能,這時(shí)就很有必要使用 debounce 或 throttle 了。

debounce 與 throttle 區(qū)別

防抖 (debounce) :多次觸發(fā),只在最后一次觸發(fā)時(shí),執(zhí)行目標(biāo)函數(shù)。

節(jié)流(throttle):限制目標(biāo)函數(shù)調(diào)用的頻率,比如:1s內(nèi)不能調(diào)用2次。

手寫一個(gè) throttle

實(shí)現(xiàn)方案有以下兩種:

  • 第一種是用時(shí)間戳來判斷是否已到執(zhí)行時(shí)間,記錄上次執(zhí)行的時(shí)間戳,然后每次觸發(fā)事件執(zhí)行回調(diào),回調(diào)中判斷當(dāng)前時(shí)間戳距離上次執(zhí)行時(shí)間戳的間隔是否已經(jīng)達(dá)到時(shí)間差(Xms) ,如果是則執(zhí)行,并更新上次執(zhí)行的時(shí)間戳,如此循環(huán)。
  • 第二種方法是使用定時(shí)器,比如當(dāng) scroll 事件剛觸發(fā)時(shí),打印一個(gè) hello world,然后設(shè)置個(gè) 1000ms 的定時(shí)器,此后每次觸發(fā) scroll 事件觸發(fā)回調(diào),如果已經(jīng)存在定時(shí)器,則回調(diào)不執(zhí)行方法,直到定時(shí)器觸發(fā),handler 被清除,然后重新設(shè)置定時(shí)器。

這里我們采用第一種方案來實(shí)現(xiàn),通過閉包保存一個(gè) previous 變量,每次觸發(fā) throttle 函數(shù)時(shí)判斷當(dāng)前時(shí)間和 previous 的時(shí)間差,如果這段時(shí)間差小于等待時(shí)間,那就忽略本次事件觸發(fā)。如果大于等待時(shí)間就把 previous 設(shè)置為當(dāng)前時(shí)間并執(zhí)行函數(shù) fn。

我們來一步步實(shí)現(xiàn),首先實(shí)現(xiàn)用閉包保存 previous 變量。

  1. const throttle = (fn, wait) => { 
  2.  // 上一次執(zhí)行該函數(shù)的時(shí)間 
  3.   let previous = 0 
  4.   return function(...args) { 
  5.     console.log(previous) 
  6.     ... 
  7.   } 

執(zhí)行 throttle 函數(shù)后會(huì)返回一個(gè)新的 function ,我們命名為 betterFn 。

  1. const betterFn = function(...args) { 
  2.   console.log(previous) 
  3.     ... 

betterFn 函數(shù)中可以獲取到 previous 變量值也可以修改,在回調(diào)監(jiān)聽或事件觸發(fā)時(shí)就會(huì)執(zhí)行 betterFn ,即 betterFn(),所以在這個(gè)新函數(shù)內(nèi)判斷當(dāng)前時(shí)間和 previous 的時(shí)間差即可。

  1. const betterFn = function(...args) { 
  2.   let now = +new Date(); 
  3.   if (now - previous > wait) { 
  4.     previous = now 
  5.     // 執(zhí)行 fn 函數(shù) 
  6.     fn.apply(this, args) 
  7.   } 

結(jié)合上面兩段代碼就實(shí)現(xiàn)了節(jié)流函數(shù),所以完整的實(shí)現(xiàn)如下。

  1. // fn 是需要執(zhí)行的函數(shù) 
  2. // wait 是時(shí)間間隔 
  3. const throttle = (fn, wait = 50) => { 
  4.   // 上一次執(zhí)行 fn 的時(shí)間 
  5.   let previous = 0 
  6.   // 將 throttle 處理結(jié)果當(dāng)作函數(shù)返回 
  7.   return function(...args) { 
  8.     // 獲取當(dāng)前時(shí)間,轉(zhuǎn)換成時(shí)間戳,單位毫秒 
  9.     let now = +new Date() 
  10.     // 將當(dāng)前時(shí)間和上一次執(zhí)行函數(shù)的時(shí)間進(jìn)行對(duì)比 
  11.     // 大于等待時(shí)間就把 previous 設(shè)置為當(dāng)前時(shí)間并執(zhí)行函數(shù) fn 
  12.     if (now - previous > wait) { 
  13.       previous = now 
  14.       fn.apply(this, args) 
  15.     } 
  16.   } 
  17.  
  18. // DEMO 
  19. // 執(zhí)行 throttle 函數(shù)返回新函數(shù) 
  20. const betterFn = throttle(() => console.log('fn 函數(shù)執(zhí)行了'), 1000) 
  21. // 每 10 毫秒執(zhí)行一次 betterFn 函數(shù),但是只有時(shí)間差大于 1000 時(shí)才會(huì)執(zhí)行 fn 
  22. setInterval(betterFn, 10) 

 

責(zé)任編輯:武曉燕 來源: 三分鐘學(xué)前端
相關(guān)推薦

2021-12-09 10:57:19

防抖函數(shù) Debounce

2016-06-30 10:24:47

JavaScript節(jié)流Throttle

2022-03-09 09:43:01

工具類線程項(xiàng)目

2021-03-18 08:04:54

AQS工具CAS

2020-11-02 08:19:18

RPC框架Java

2022-01-26 15:20:00

配置微服務(wù)架構(gòu)

2021-02-22 17:17:38

Proxy緩存代碼

2017-03-02 13:31:02

監(jiān)控系統(tǒng)

2022-10-31 08:27:53

Database數(shù)據(jù)數(shù)據(jù)庫

2020-09-27 14:13:50

Spring BootJava框架

2024-08-02 09:49:35

Spring流程Tomcat

2024-03-08 08:26:20

防抖節(jié)流delay?

2021-02-20 09:45:02

RPC框架Java

2022-01-17 11:50:38

Linux CPULinux 系統(tǒng)

2020-12-13 11:57:57

Nodejs微信開發(fā)

2022-05-17 20:37:41

MyPick泛型對(duì)象類型

2020-04-20 09:02:33

函數(shù)RPCCPU

2021-02-21 09:25:41

開源技術(shù) 工具

2015-06-02 09:51:40

iOS網(wǎng)絡(luò)請(qǐng)求封裝接口

2022-01-10 11:04:41

單鏈表面試編程
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 中文字幕国产视频 | 亚洲夜夜爽| 国产精品国产 | 福利视频一区二区三区 | 日韩一区欧美一区 | www.成人.com | 91精品久久久久 | 91一区二区| 美国一级黄色片 | 日韩国产三区 | 国产精品成人在线观看 | 欧美激情视频一区二区三区免费 | 免费看国产片在线观看 | 成人av一区| 亚洲天堂免费在线 | 91在线电影| 综合网伊人| 国产精品一区二区在线 | 欧美日韩视频在线 | 日日想夜夜操 | 在线视频91 | 国产精品久久精品 | 国产精品伦理一区 | 在线免费观看成年人视频 | 久久丝袜 | 中文字幕 国产精品 | 欧美区日韩区 | 一级黄色片网站 | 一区欧美 | 欧美一级欧美三级在线观看 | 91玖玖| 欧美一区在线看 | 亚洲精品久久久久久久不卡四虎 | 国产精品一区在线 | 日本午夜精品 | 国产午夜精品一区二区三区嫩草 | 伊人无码高清 | 日韩欧美综合 | 亚欧午夜 | 亚洲欧美中文日韩在线v日本 | 欧美 日韩 亚洲91麻豆精品 |