亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS函數節流和防抖之間的區分和實現詳解

2024-05-06 16:47:42
字體:
來源:轉載
供稿:網友

在寫JS時,這兩個函數比較常見,有時候傻傻分不清用哪個,或者說知道代碼要怎么寫,但要說出它究竟是節流函數還是防抖函數時一臉楞逼。今天有一個同學分享了這兩個的區分,我也來回顧一下,加深一下印象,以便日后用到時心里有底。PS:百度和谷歌搜索前幾個介紹都是相反介紹,本文為原創,如有雷同純屬抄襲我的。

節流概念(Throttle)

按照設定的時間固定執行一次函數,比如200ms一次。注意:固定就是你在mousemove過程中,執行這個節流函數,它一定是200ms(你設定的定時器延遲時間)內執行一次。沒到200ms,一定會返回,沒有執行回調函數的。

主要應用場景有:scroll、touchmove

防抖概念(Debounce)

抖動停止后的時間超過設定的時間時執行一次函數。注意:這里的抖動停止表示你停止了觸發這個函數,從這個時間點開始計算,當間隔時間等于你設定時間,才會執行里面的回調函數。如果你一直在觸發這個函數并且兩次觸發間隔小于設定時間,則一定不會到回調函數那一步。

主要應用場景有:input驗證、搜索聯想、resize

節流實現

思路: 第一次先設定一個變量true,第二次執行這個函數時,會判斷變量是否true,是則返回。當第一次的定時器執行完函數最后會設定變量為flase。那么下次判斷變量時則為flase,函數會依次運行。

代碼一:首次不執行

function throttle(fn,delay=100){ //首先設定一個變量,在沒有執行我們的定時器時為null let timer = null; return function(){ //當我們發現這個定時器存在時,則表示定時器已經在運行中,需要返回 if(timer) return; timer = setTimeout(()=>{ fn.apply(this,arguments); timer = null; },delay); }}

代碼二:首次執行

function throttle2(fn,delay=100){ let last = 0; return function(){ let curr = +new Date(); if(curr - last > delay){ fn.apply(this,arguments); last = curr; } }}

防抖實現

思路:首次運行時把定時器賦值給一個變量,第二次執行時,如果間隔沒超過定時器設定的時間則會清除掉定時器,重新設定定時器,依次反復,當我們停止下來時,沒有執行清除定時器,超過一定時間后觸發回調函數。

代碼一:首次不執行

function debounce(fn,delay=200){ let timer = null; return function(){ if(timer) clearTimeout(timer); timer = setTimeout(()=>{ fn.apply(this,arguments); timer = null; },delay); }}

代碼二:首次執行

function debounce2(fn, delay = 200, atBegin = true) { let timer = null, last = 0,during; return function () { let self = this, args = arguments; var exec = function () { fn.apply(self, args); } if (atBegin && !timer) { exec(); atBegin = false; } else { during = Date.now() - last; if (during > delay) { exec(); } else { if (timer) clearTimeout(timer); timer = setTimeout(function () {  exec(); }, delay); } } last = Date.now(); }}

上面的代碼只是我自己的一個簡單實現,看看lodash里面的兩個核心實現代碼。生產中建議使用它們的庫,畢竟有這么多人在用,出bug的機會比較少,我上面的代碼有可能有一些情況沒考慮到。如果你發現有問題的,也請告訴我。

如果在項目中有需要用到的,可以直接安裝單個的NPM模塊。throttle 和 debounce

lodash使用使用文檔

lodash庫里面這兩個函數設置的參數有點復雜,記錄一下里面的參數和代碼使用。

節流(throttle)

官方文檔解釋:

創建一個節流函數,在 wait 秒內最多執行 func 一次的函數。 該函數提供一個 cancel 方法取消延遲的函數調用以及 flush 方法立即調用。 可以提供一個 options 對象決定如何調用 func 方法, options.leading 與|或 options.trailing 決定 wait 前后如何觸發。 func 會傳入最后一次傳入的參數給這個函數。 隨后調用的函數返回是最后一次 func 調用的結果。

注意: 如果 leading 和 trailing 都設定為 true 則 func 允許 trailing 方式調用的條件為: 在 wait 期間多次調用。

如果 wait 為 0 并且 leading 為 false, func調用將被推遲到下一個點,類似setTimeout為0的超時。

參數

func (Function)要節流的函數[wait=0] (number)需要節流的毫秒[options] (Object)選項對象[options.leading=true] (boolean)指定調用在節流開始前[options.trailing=true] (boolean)指定調用在節流結束后

返回值 (Function)

返回節流的函數

示例

// 避免在滾動時過分的更新定位jQuery(window).on('scroll', _.throttle(updatePosition, 100));// 點擊后就調用 `renewToken`,但5分鐘內超過1次。var throttled = _.throttle(renewToken, 300000, { 'trailing': false });jQuery(element).on('click', throttled);// 取消一個 trailing 的節流調用jQuery(window).on('popstate', throttled.cancel);

防抖(debounce)

創建一個 debounced(防抖動)函數,該函數會從上一次被調用后,延遲 wait 毫秒后調用 func 方法。 debounced(防抖動)函數提供一個 cancel 方法取消延遲的函數調用以及 flush 方法立即調用。 可以提供一個 options(選項) 對象決定如何調用 func 方法,options.leading 與 options.trailing 決定延遲前后如何觸發(先調用后等待 還是 先等待后調用)。 func 調用時會傳入最后一次提供給 debounced(防抖動)函數 的參數。 后續調用的 debounced(防抖動)函數返回是最后一次 func 調用的結果。

注意: 如果 leading 和 trailing 選項為 true, 則 func 允許 trailing 方式調用的條件為: 在 wait 期間多次調用防抖方法。

如果 wait 為 0 并且 leading 為 false, func調用將被推遲到下一個點,類似setTimeout為0的超時。

參數

func (Function)要防抖動的函數[wait=0] (number)需要延遲的毫秒數[options] (Object)選項對象[options.leading=false] (boolean)指定調用在延遲開始前[options.maxWait] (number)設置 func 允許被延遲的最大值[options.trailing=true] (boolean)指定調用在延遲結束后

返回值 (Function)

返回具有防抖動功能的函數

示例

// 避免窗口在變動時出現昂貴的計算開銷。jQuery(window).on('resize', _.debounce(calculateLayout, 150));// 當點擊時 `sendMail` 隨后就被調用。jQuery(element).on('click', _.debounce(sendMail, 300, { 'leading': true, 'trailing': false}));// 確保 `batchLog` 調用1次之后,1秒內會被觸發。var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });var source = new EventSource('/stream');jQuery(source).on('message', debounced);// 取消一個 trailing 的防抖動調用jQuery(window).on('popstate', debounced.cancel);

以上就是這篇節流和防抖的全部介紹,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品一区二区视频在线观看| 欧美肥婆姓交大片| 黑人巨大精品欧美一区二区三区| 欧美国产日韩在线| 久久精品男人天堂| 久国内精品在线| 亚洲夜晚福利在线观看| 欧美电影在线观看高清| 国产在线视频不卡| 奇门遁甲1982国语版免费观看高清| 国产精品日韩在线播放| 91久久精品国产91久久| 国产精品午夜国产小视频| 国产精品视频永久免费播放| 欧美老少配视频| 久久久久久久999精品视频| 久久久久久久久久久人体| 亚洲一区二区三区视频播放| 国产美女久久久| 97色在线观看免费视频| 亚洲欧美一区二区三区久久| 国产精品丝袜高跟| 国产一区二区欧美日韩| 欧美猛交免费看| 久久亚洲国产精品| 国产主播欧美精品| 亚洲人精品午夜在线观看| 永久免费毛片在线播放不卡| 欧美性受xxxx黑人猛交| 一个色综合导航| 国产精品精品久久久久久| 久久综合网hezyo| 日韩精品免费在线视频| 日本欧美国产在线| 国产精品久久久久久久久久久久久| 成人久久久久久久| 91精品久久久久久久久不口人| 国内久久久精品| 国产成人久久精品| 国产免费亚洲高清| 国产精品18久久久久久首页狼| 亚洲天堂第二页| 全亚洲最色的网站在线观看| 国产又爽又黄的激情精品视频| 国产精品欧美亚洲777777| 国产99久久精品一区二区| 精品久久久在线观看| 欧美日韩国产在线播放| 青草热久免费精品视频| 国产ts人妖一区二区三区| 久久久亚洲成人| 亚洲片在线资源| 亚洲第一精品夜夜躁人人躁| 久久久国产影院| 国产精品国产三级国产aⅴ9色| 亚洲女人被黑人巨大进入| 中文字幕不卡在线视频极品| 亚洲片在线资源| 国产一区二区三区久久精品| 欧美插天视频在线播放| 久久九九免费视频| 亚洲一二在线观看| 欧美另类极品videosbestfree| 成人激情视频在线| 欧美日韩中文字幕在线视频| 国产女人18毛片水18精品| 久久精品国产91精品亚洲| 精品香蕉在线观看视频一| 国产亚洲精品久久久优势| 26uuu亚洲国产精品| 亚洲国产精品va| 亚洲欧美三级伦理| 国产一区私人高清影院| 久久久91精品国产| 亚洲综合精品伊人久久| 国产欧美日韩综合精品| 亚洲欧美国产精品va在线观看| 欧洲亚洲妇女av| 久久成人精品一区二区三区| 国产精品你懂得| 日韩理论片久久| 中文字幕亚洲在线| 亚洲精品免费网站| 国产精品久久久久免费a∨大胸| 日韩激情在线视频| 91精品久久久久| www.美女亚洲精品| 久久久免费电影| 国产亚洲一区精品| 久久国产精品久久精品| 亚洲一区二区在线| 视频直播国产精品| 亚洲欧美日韩另类| 17婷婷久久www| 欧美成人免费一级人片100| 亚洲图片欧美日产| 亚洲黄色成人网| 粗暴蹂躏中文一区二区三区| 亚洲天堂av在线免费观看| 26uuu另类亚洲欧美日本老年| 欧美激情久久久久| 欧美国产日韩在线| 97精品在线视频| 岛国av一区二区在线在线观看| 久久中文字幕在线| 精品女厕一区二区三区| 精品国内自产拍在线观看| 国产成人福利网站| 中文字幕欧美在线| 亚洲一区二区精品| 国产精品免费福利| 午夜精品久久久久久久久久久久久| 中文字幕国产精品| 在线观看视频亚洲| 欧美成人精品三级在线观看| 亚洲美女激情视频| 欧美性做爰毛片| 欧美性猛交xxxx免费看久久久| xvideos亚洲| 欧美日韩午夜剧场| 好吊成人免视频| 日韩网站免费观看高清| 国产精品v日韩精品| 国产一区二区精品丝袜| 中文字幕v亚洲ⅴv天堂| 欧美激情精品久久久久久久变态| 欧美激情中文字幕乱码免费| 亚洲女人天堂成人av在线| 91麻豆国产语对白在线观看| 一区二区三区视频在线| 性欧美xxxx视频在线观看| 欧美成aaa人片在线观看蜜臀| 国产精品美女www爽爽爽视频| 91精品国产91久久| 欧美高清视频免费观看| 一本一本久久a久久精品综合小说| 亚洲天堂网在线观看| 57pao成人国产永久免费| 久久久精品一区二区三区| 最近2019中文字幕在线高清| 国产网站欧美日韩免费精品在线观看| 亚洲乱码av中文一区二区| 久久精品小视频| 国产精品日韩在线一区| 欧美性xxxxxx| 97超级碰在线看视频免费在线看| xvideos成人免费中文版| 欧美寡妇偷汉性猛交| 国产精品视频永久免费播放| 国产99视频在线观看| 欧美激情中文字幕在线| 91精品国产综合久久香蕉922| 国产日韩欧美中文在线播放| 国产日韩欧美在线观看| 亚洲午夜久久久影院| 欧美午夜视频在线观看| 在线观看亚洲区| 中文字幕综合一区| 中文字幕最新精品| 精品久久久中文| www.欧美视频| 欧美极品欧美精品欧美视频| 亚洲视频在线免费看| 亚洲免费av网址|