国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

高頻:手寫一個防抖函數 Debounce

開發 前端
實現原理就是利用定時器,函數第一次執行時設定一個定時器,之后調用時發現已經設定過定時器就清空之前的定時器,并重新設定一個新的定時器,如果存在沒有被清空的定時器,當定時器計時結束后觸發函數執行。

[[439482]]

本文轉載自微信公眾號「三分鐘學前端」,作者sisterAn  。轉載本文請聯系三分鐘學前端公眾號。

我們上次 手寫了一個節流函數throttle ,這周我們繼續手寫手寫一個防抖函數 debounce

手寫一個 debounce

防抖函數 debounce 指的是某個函數在某段時間內,無論觸發了多少次回調,都只執行最后一次。

實現原理就是利用定時器,函數第一次執行時設定一個定時器,之后調用時發現已經設定過定時器就清空之前的定時器,并重新設定一個新的定時器,如果存在沒有被清空的定時器,當定時器計時結束后觸發函數執行。

  1. // fn 是需要防抖處理的函數 
  2. // wait 是時間間隔 
  3. function debounce(fn, wait = 50) { 
  4.     // 通過閉包緩存一個定時器 id 
  5.     let timer = null 
  6.     // 將 debounce 處理結果當作函數返回 
  7.     // 觸發事件回調時執行這個返回函數 
  8.     return function(...args) { 
  9.         // this保存給context 
  10.         const context = this 
  11.        // 如果已經設定過定時器就清空上一次的定時器 
  12.         if (timer) clearTimeout(timer) 
  13.        
  14.        // 開始設定一個新的定時器,定時器結束后執行傳入的函數 fn 
  15.         timer = setTimeout(() => { 
  16.             fn.apply(context, args) 
  17.         }, wait) 
  18.     } 
  19.  
  20. // DEMO 
  21. // 執行 debounce 函數返回新函數 
  22. const betterFn = debounce(() => console.log('fn 防抖執行了'), 1000) 
  23. // 停止滑動 1 秒后執行函數 () => console.log('fn 防抖執行了'
  24. document.addEventListener('scroll', betterFn) 

不過 underscore 中的 debounce 還有第三個參數:immediate 。這個參數是做什么用的呢?

傳參 immediate 為 true, debounce會在 wait 時間間隔的開始調用這個函數 。(注:并且在 wait 的時間之內,不會再次調用。)在類似不小心點了提交按鈕兩下而提交了兩次的情況下很有用。

把 true 傳遞給 immediate 參數,會讓 debounce 在 wait 時間開始計算之前就觸發函數(也就是沒有任何延時就觸發函數),而不是過了 wait 時間才觸發函數,而且在 wait 時間內也不會觸發(相當于把 fn 的執行鎖住)。如果不小心點了兩次提交按鈕,第二次提交就會不會執行。

那我們根據 immediate 的值來決定如何執行 fn 。如果是 immediate 的情況下,我們立即執行 fn ,并在 wait 時間內鎖住 fn 的執行, wait 時間之后再觸發,才會重新執行 fn ,以此類推。

  1. // immediate 表示第一次是否立即執行 
  2. function debounce(fn, wait = 50, immediate) { 
  3.     let timer = null 
  4.     return function(...args) { 
  5.         // this保存給context 
  6.         const context = this 
  7.         if (timer) clearTimeout(timer) 
  8.        
  9.        // immediate 為 true 表示第一次觸發后執行 
  10.        // timer 為空表示首次觸發 
  11.         if (immediate && !timer) { 
  12.             fn.apply(context, args) 
  13.         } 
  14.         
  15.         timer = setTimeout(() => { 
  16.             fn.apply(context, args) 
  17.         }, wait) 
  18.     } 
  19.  
  20. // DEMO 
  21. // 執行 debounce 函數返回新函數 
  22. const betterFn = debounce(() => console.log('fn 防抖執行了'), 1000, true
  23. // 第一次觸發 scroll 執行一次 fn,后續只有在停止滑動 1 秒后才執行函數 fn 
  24. document.addEventListener('scroll', betterFn) 

underscore 源碼解析

看完了上文的基本版代碼,感覺還是比較輕松的,現在來學習下 underscore 是如何實現 debounce 函數的,學習一下優秀的思想,直接上代碼和注釋,本源碼解析依賴于 underscore 1.9.1 版本實現。

  1. // 此處的三個參數上文都有解釋 
  2. _.debounce = function(func, wait, immediate) { 
  3.   // timeout 表示定時器 
  4.   // result 表示 func 執行返回值 
  5.   var timeout, result; 
  6.  
  7.   // 定時器計時結束后 
  8.   // 1、清空計時器,使之不影響下次連續事件的觸發 
  9.   // 2、觸發執行 func 
  10.   var later = function(context, args) { 
  11.     timeout = null
  12.     // if (args) 判斷是為了過濾立即觸發的 
  13.     // 關聯在于 _.delay 和 restArguments 
  14.     if (args) result = func.apply(context, args); 
  15.   }; 
  16.  
  17.   // 將 debounce 處理結果當作函數返回 
  18.   var debounced = restArguments(function(args) { 
  19.     if (timeout) clearTimeout(timeout); 
  20.     if (immediate) { 
  21.       // 第一次觸發后會設置 timeout, 
  22.       // 根據 timeout 是否為空可以判斷是否是首次觸發 
  23.       var callNow = !timeout; 
  24.       timeout = setTimeout(later, wait); 
  25.       if (callNow) result = func.apply(this, args); 
  26.     } else { 
  27.      // 設置定時器 
  28.       timeout = _.delay(later, wait, this, args); 
  29.     } 
  30.  
  31.     return result; 
  32.   }); 
  33.  
  34.   // 新增 手動取消 
  35.   debounced.cancel = function() { 
  36.     clearTimeout(timeout); 
  37.     timeout = null
  38.   }; 
  39.  
  40.   return debounced; 
  41. }; 
  42.  
  43. // 根據給定的毫秒 wait 延遲執行函數 func 
  44. _.delay = restArguments(function(func, wait, args) { 
  45.   return setTimeout(function() { 
  46.     return func.apply(null, args); 
  47.   }, wait); 
  48. }); 

相比上文的基本版實現,underscore 多了以下幾點功能。

1、函數 func 的執行結束后返回結果值 result

2、定時器計時結束后清除 timeout ,使之不影響下次連續事件的觸發

3、新增了手動取消功能 cancel

4、immediate 為 true 后只會在第一次觸發時執行,頻繁觸發回調結束后不會再執行

參考

深入淺出防抖函數 debounce 

前端面試題——自己實現debounce

 

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

2021-12-07 06:55:17

節流函數Throttle

2024-03-08 08:26:20

防抖節流delay?

2023-12-18 07:37:17

JavaScript防抖節流

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

配置微服務架構

2025-11-27 01:33:00

2017-03-02 13:31:02

監控系統

2021-02-22 17:17:38

Proxy緩存代碼

2022-10-31 08:27:53

Database數據數據庫

2024-05-28 09:26:46

2020-09-27 14:13:50

Spring BootJava框架

2022-05-15 22:08:58

ReactHookdebounce

2024-08-02 09:49:35

Spring流程Tomcat

2024-08-29 15:26:21

2021-12-13 07:50:14

前端性能優化

2021-02-20 09:45:02

RPC框架Java

2022-01-17 11:50:38

Linux CPULinux 系統

2020-12-13 11:57:57

Nodejs微信開發
點贊
收藏

51CTO技術棧公眾號

欧美久久久久久| 欧美白人做受xxxx视频| 九色精品91| 91精品国产欧美一区二区18| h七七www色午夜日本| 99久久99久久精品免费看蜜桃 | 日本激情在线观看| 亚洲国产精品精华液网站| 久热免费在线观看| 成人av在线观| 精品人妻大屁股白浆无码| 日本亚洲一区二区| 欧美日韩一区二区三| 国产美女精品| 欧美不卡在线一区二区三区| 99视频一区| 国模精品一区二区三区| 国产精品av久久久久久麻豆网| 国产精品爽爽爽| 97精品视频在线看| 91美女高潮出水| 99欧美视频| 7777奇米亚洲综合久久| 亚洲澳门在线| av噜噜色噜噜久久| 亚洲狠狠婷婷| 日本一区二区精品视频| 麻豆精品在线播放| 精品嫩模一区二区三区| 成+人+亚洲+综合天堂| 少妇高潮毛片色欲ava片| av爱爱亚洲一区| 北条麻妃视频在线| 国产精品国产三级国产aⅴ中文| 国产经典视频一区| 亚洲国产视频在线| eeuss影院www在线观看| 精品剧情v国产在线观看在线| 蜜桃视频动漫在线播放| 日韩亚洲欧美中文高清在线| 国内精品国产成人国产三级粉色 | 91老司机精品视频| 欧美暴力喷水在线| 欧美日韩国产高清视频| 国产一区在线不卡| 日韩 欧美 高清| 一区二区三区蜜桃| 2019中文字幕在线视频| 日韩av网址在线| 大型av综合网站| 亚洲综合色av| 久久99精品国产麻豆婷婷洗澡| 欧美牲交a欧美牲交| 一区二区三区中文字幕在线观看| 啊v在线视频| 中文字幕少妇一区二区三区| 亚洲午夜久久| 久久久水蜜桃| 99国产精品久久久久久久久久久| 欧美成人影院在线播放| 91精品国产色综合久久不卡电影 | 日韩欧美中文一区| 国产精品成人**免费视频| 国产精品久久激情| 日韩精品91亚洲二区在线观看 | 蜜臀av一级做a爰片久久| www黄色在线| 欧美系列日韩一区| 日韩av中字| 国产精品麻豆va在线播放| 男女av一区三区二区色多| 国产深夜男女无套内射| av中文字幕在线看| 调教视频vk| 亚洲人成精品久久久 | 欧美日韩黄网站| 国产成人极品视频| 午夜精品亚洲| 免费男同深夜夜行网站| 欧美精品丝袜中出| 免费观看亚洲天堂| 黄色91av| 亚洲天堂网中文字| 筱崎爱全乳无删减在线观看| 国产精品免费久久久久影院| 国产精品99久久久久久似苏梦涵| 亚洲欧美另类动漫| 精品欧美一区二区久久| 日韩精品一卡| 日韩在线视频在线观看| 欧美视频一区二| 久久这里只有精品一区二区| 91香蕉视频网址| 日本乱人伦aⅴ精品| 精品久久对白| 国产高清不卡无码视频| 欧美色国产精品| 亚洲福利天堂| av之家在线观看| 亚洲大胆美女视频| 黄色另类av| 两个人hd高清在线观看| 久久久久久久国产| 国产一区二区三区黄视频 | 国产精品伦一区二区| 精品国产区在线| 亚洲三级视频在线观看| 欧美国产日韩电影| 日本不卡一区二区三区在线观看| 性久久久久久久| 91在线一区| 欧美一级在线看| 精品小视频在线| 美女尤物久久精品| 黑人与亚洲人色ⅹvideos| 国产精品入口夜色视频大尺度| 日本一区二区成人| 精品麻豆剧传媒av国产九九九| 成年人深夜视频| 亚洲香蕉在线观看| 精品在线播放免费| 大桥未久在线播放| 日本不卡高清视频一区| 欧美久久久久久久久| 亚洲美女黄网| 欧美精品日韩少妇| 久久久影院一区二区三区| 欧美亚洲国产一区二区三区| 日韩久久午夜影院| 999久久久91| av男人的天堂网| 免费av一区二区| 成年人午夜久久久| 日韩一区二区三区在线免费观看 | 亚洲视频你懂的| 久久久久久久久久久久电影| 成人在线观看毛片| 亚洲毛片在线观看.| 精品一区二区三区免费观看| а√天堂中文资源在线bt| 日本不卡一区二区三区视频| 精品精品欲导航| 精品一区二区日韩| 亚洲天堂成人| 蜜桃在线一区二区三区| 亚洲大片在线观看| 日日狠狠久久偷偷四色综合免费| 国产精选久久久久久| 99国产超薄肉色丝袜交足的后果| 欧美一级成年大片在线观看| 欧美日韩一本到| 亚洲欧美日韩网| 在线成人av影院| 亚洲第一福利网| 中文字幕亚洲一区二区三区| 欧洲人成人精品| 一区二区三区四区激情| 亚洲综合色自拍一区| 超碰97人人做人人爱少妇| 亚洲精品第一页| 麻豆精品国产传媒mv男同| 亚洲一卡二卡三卡四卡五卡| 精品视频在线免费观看| 国产精品久久久久一区二区三区共 | 欧美成人milf| 日韩在线麻豆| 日日夜夜精品视频免费| 黄色成人精品网站| a美女胸又www黄视频久久| 福利一区二区在线| 白白色 亚洲乱淫| 久久亚洲二区三区| 欧美日韩一区二区三区在线看| 精品成人佐山爱一区二区| 欧美日韩精品在线| 国产精品美女久久久久久| 一本色道亚洲精品aⅴ| 日韩高清欧美高清| 鲁鲁狠狠狠7777一区二区| 亚洲成人在线免费| 久久国产成人精品| 99精品99| 久久一区二区三区四区| 一级中文字幕一区二区| 亚洲美女区一区| 亚洲欧美在线视频观看| 国产精品国产三级国产普通话99 | 久久免费国产精品1| 粉嫩av一区二区三区免费观看| 亚洲精品98久久久久久中文字幕| 欧美综合激情网| 久久伦理网站| 一级片免费视频| 精品久久ai| 亚洲线精品一区二区三区八戒| 中文字幕欧美精品日韩中文字幕| 日韩欧美中文字幕制服| 精品国内亚洲在观看18黄| 欧美一级片一区| 777久久精品一区二区三区无码|