JavaScript中防抖和節(jié)流的區(qū)別及適用場(chǎng)景
前言
防抖和節(jié)流,這個(gè)在我們的前端生涯中,這兩個(gè)名詞肯定不陌生,甚至經(jīng)常被人問(wèn)起:
- 兩者有什么區(qū)別?
- 分別用于什么場(chǎng)景?
ps:這就是高頻的面試題了吧!
防抖
防抖是什么呢?
形象的的說(shuō)就是:防止抖動(dòng)(防抖函數(shù)內(nèi)心獨(dú)白:“你就抖動(dòng)吧!等你不抖動(dòng)了,我們?cè)谶M(jìn)行下一步”)
例如
一個(gè)搜索輸入框, 用戶不停的進(jìn)行輸入(這個(gè)時(shí)候就是抖動(dòng)的過(guò)程), 等用戶輸入停止之后,再觸發(fā)搜索。
代碼演示
function debounce(fn, delay = 200) { let timer = 0 return function() { // 如果這個(gè)函數(shù)已經(jīng)被觸發(fā)了 if(timer){ clearTimeout(timer) } timer = setTimeout(() => { fn.apply(this, arguments); // 透?jìng)?this和參數(shù) timer = 0 },delay) } }
節(jié)流
節(jié)流:節(jié)省交互溝通。
形象的的說(shuō)就是:no!no!no!一個(gè)一個(gè)來(lái),按照時(shí)間節(jié)奏來(lái)!插隊(duì)禁止!
例如
drag(拖動(dòng))事件或者 scroll(滾動(dòng)) 期間觸發(fā)某個(gè)毀掉,要設(shè)置一個(gè)時(shí)間間隔。這時(shí)候就不能使用防抖了,為什么呢?
防抖是拖拽或者滾動(dòng)結(jié)束之后才返回回調(diào),但是我是需要在過(guò)程中進(jìn)行觸發(fā)回調(diào),但是又不需要那么的頻繁;這時(shí)候就使用節(jié)流函數(shù),每隔一定的時(shí)間進(jìn)項(xiàng)觸發(fā)就好了!
代碼演示
// 節(jié)流函數(shù) function throttle(fn, delay = 200) { let timer = 0 return function () { if(timer){ return } timer.setTimeout(() =>{ fn.apply(this, arguments); // 透?jìng)?this和參數(shù) timer = 0 },delay) } }
咋一看,怎么和防抖函數(shù)好像怎么這么像?
區(qū)別僅僅在:
防抖:
if(timer){ clearTimeout(timer) }
節(jié)流:
if(timer){ return }
他們?cè)诙〞r(shí)器已經(jīng)有任務(wù)的時(shí)候的操作的不同。在我們上面介紹了防抖和節(jié)流的概念之后,大家應(yīng)該都懂了。
防抖函數(shù)在每一次都有內(nèi)容后進(jìn)行清除是為了保證當(dāng)前執(zhí)行的函數(shù)就是當(dāng)前規(guī)定的時(shí)間內(nèi)執(zhí)行的最后一次操作
if(timer){ clearTimeout(timer) }
節(jié)流函數(shù)如此操作是為了保證,在規(guī)定的時(shí)間內(nèi)只會(huì)執(zhí)行一次這個(gè)操作,這就是兩個(gè)函數(shù)從代碼上看到的不同
if(timer){ return }
到此這篇關(guān)于JavaScript中防抖和節(jié)流的區(qū)別及適用場(chǎng)景的文章就介紹到這了,更多相關(guān)JS防抖和節(jié)流 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文學(xué)會(huì)JavaScript如何手寫(xiě)防抖節(jié)流
- 一文教你徹底學(xué)會(huì)JavaScript手寫(xiě)防抖節(jié)流
- JavaScript防抖與節(jié)流超詳細(xì)全面講解
- 利用JavaScript實(shí)現(xiàn)防抖節(jié)流函數(shù)的示例代碼
- JavaScript函數(shù)防抖與函數(shù)節(jié)流的定義及使用詳解
- JS中節(jié)流和防抖函數(shù)的實(shí)現(xiàn)及區(qū)別示例
- JavaScript防抖動(dòng)與節(jié)流處理
- Vue手寫(xiě)防抖和節(jié)流函數(shù)代碼詳解
相關(guān)文章
怎樣用Javascript實(shí)現(xiàn)單例模式
這篇文章主要介紹了怎樣用Javascript實(shí)現(xiàn)單例模式,想學(xué)習(xí)設(shè)計(jì)模式的同學(xué),可以參考下2021-04-04JavaScript實(shí)現(xiàn)簡(jiǎn)單輪播圖效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)圖片輪播,左右翻轉(zhuǎn),圖片切換顯示等效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12微信小程序開(kāi)發(fā)實(shí)戰(zhàn)快速入門教程
這篇文章主要為大家介紹了開(kāi)發(fā)一個(gè)微信小程序?qū)崙?zhàn)快速入門教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04ajax請(qǐng)求get與post的區(qū)別總結(jié)
本篇文章是對(duì)ajax請(qǐng)求get與post的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11js數(shù)組方法reduce經(jīng)典用法代碼分享
本文給大家整理了很多關(guān)于js數(shù)組方法reduce的經(jīng)典代碼片段,能夠讓大家更好的理解reduce的實(shí)例用法,一起學(xué)習(xí)下吧。2018-01-01用js代碼和插件實(shí)現(xiàn)wordpress雪花飄落效果的四種方法
這篇文章主要介紹了用js代碼和插件實(shí)現(xiàn)wordpress雪花飄落效果的四種方法,需要的朋友可以參考下2014-12-12