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

高頻:手寫一個節流函數 Throttle

開發 前端
比如綁定響應鼠標移動、窗口大小調整、滾屏等事件時,綁定的函數觸發的頻率會很頻繁。若稍處理函數微復雜,需要較多的運算執行時間和資源,往往會出現延遲,甚至導致假死或者卡頓感。為了優化性能,這時就很有必要使用 debounce 或 throttle 了。

[[438987]]

debounce 與 throttle 是開發中常用的高階函數,作用都是為了防止函數被高頻調用,換句話說就是,用來控制某個函數在一定時間內執行多少次。

使用場景

比如綁定響應鼠標移動、窗口大小調整、滾屏等事件時,綁定的函數觸發的頻率會很頻繁。若稍處理函數微復雜,需要較多的運算執行時間和資源,往往會出現延遲,甚至導致假死或者卡頓感。為了優化性能,這時就很有必要使用 debounce 或 throttle 了。

debounce 與 throttle 區別

防抖 (debounce) :多次觸發,只在最后一次觸發時,執行目標函數。

節流(throttle):限制目標函數調用的頻率,比如:1s內不能調用2次。

手寫一個 throttle

實現方案有以下兩種:

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

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

我們來一步步實現,首先實現用閉包保存 previous 變量。

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

執行 throttle 函數后會返回一個新的 function ,我們命名為 betterFn 。

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

betterFn 函數中可以獲取到 previous 變量值也可以修改,在回調監聽或事件觸發時就會執行 betterFn ,即 betterFn(),所以在這個新函數內判斷當前時間和 previous 的時間差即可。

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

結合上面兩段代碼就實現了節流函數,所以完整的實現如下。

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

 

責任編輯:武曉燕 來源: 三分鐘學前端
相關推薦

2021-12-09 10:57:19

防抖函數 Debounce

2016-06-30 10:24:47

JavaScript節流Throttle

2022-03-09 09:43:01

工具類線程項目

2021-03-18 08:04:54

AQS工具CAS

2020-11-02 08:19:18

RPC框架Java

2022-01-26 15:20:00

配置微服務架構

2021-02-22 17:17:38

Proxy緩存代碼

2017-03-02 13:31:02

監控系統

2022-10-31 08:27:53

Database數據數據庫

2020-09-27 14:13:50

Spring BootJava框架

2024-08-02 09:49:35

Spring流程Tomcat

2024-03-08 08:26:20

防抖節流delay?

2021-02-20 09:45:02

RPC框架Java

2022-01-17 11:50:38

Linux CPULinux 系統

2020-12-13 11:57:57

Nodejs微信開發

2022-05-17 20:37:41

MyPick泛型對象類型

2020-04-20 09:02:33

函數RPCCPU

2021-02-21 09:25:41

開源技術 工具

2015-06-02 09:51:40

iOS網絡請求封裝接口

2022-01-10 11:04:41

單鏈表面試編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线成人| 黄色免费av | 亚州成人| 久久久中文 | 免费日韩网站 | 蜜桃传媒av | 国产成人叼嘿视频在线观看 | 五月婷婷激情网 | 欧美精品一区二区免费 | 日本一本视频 | 国产免费一区二区 | 美女日批免费视频 | 风间由美一区二区三区在线观看 | 在线观看成人小视频 | 中文字幕一区在线观看视频 | 日日操视频 | 国产精品久久二区 | 永久免费在线观看 | 欧美日韩免费在线 | 免费的av | 日韩av一区在线观看 | 日韩精品免费播放 | 欧美二区在线 | 一区二区高清 | 亚洲欧美一区二区三区国产精品 | 很黄很污的网站 | 国产日批 | 精品粉嫩aⅴ一区二区三区四区 | 国产一级一级国产 | 亚洲一区二区三区免费在线观看 | 超碰在线人人干 | 天天操狠狠操 | 天堂一区二区三区 | 日韩1区| 久久精品国产99国产精品 | 91原创视频| 欧美激情在线精品一区二区三区 | 国产精品免费看 | 中国一级大毛片 | 亚洲一区二区三区免费在线观看 | 激情网站|