色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解JS函數(shù)防抖

瀏覽:85日期:2024-05-05 09:12:29

一、什么是函數(shù)防抖

概念:函數(shù)防抖(debounce),就是指觸發(fā)事件后,在 n 秒內(nèi)函數(shù)只能執(zhí)行一次,如果觸發(fā)事件后在 n 秒內(nèi)又觸發(fā)了事件,則會(huì)重新計(jì)算函數(shù)延執(zhí)行時(shí)間。

舉個(gè)栗子,坐電梯的時(shí)候,如果電梯檢測(cè)到有人進(jìn)來(lái)(觸發(fā)事件),就會(huì)多等待 10 秒,此時(shí)如果又有人進(jìn)來(lái)(10秒之內(nèi)重復(fù)觸發(fā)事件),那么電梯就會(huì)再多等待 10 秒。在上述例子中,電梯在檢測(cè)到有人進(jìn)入 10 秒鐘之后,才會(huì)關(guān)閉電梯門開始運(yùn)行,因此,“函數(shù)防抖”的關(guān)鍵在于,在 一個(gè)事件 發(fā)生 一定時(shí)間 之后,才執(zhí)行 特定動(dòng)作

二、為什么需要函數(shù)防抖

前端開發(fā)過程中,有一些事件,常見的例如,onresize,scroll,mousemove ,mousehover 等,會(huì)被頻繁觸發(fā)(短時(shí)間內(nèi)多次觸發(fā)),不做限制的話,有可能一秒之內(nèi)執(zhí)行幾十次、幾百次,如果在這些函數(shù)內(nèi)部執(zhí)行了其他函數(shù),尤其是執(zhí)行了操作 DOM 的函數(shù)(瀏覽器操作 DOM 是很耗費(fèi)性能的),那不僅會(huì)浪費(fèi)計(jì)算機(jī)資源,還會(huì)降低程序運(yùn)行速度,甚至造成瀏覽器卡死、崩潰。這種問題顯然是致命的。

除此之外,短時(shí)間內(nèi)重復(fù)的 ajax 調(diào)用不僅會(huì)造成數(shù)據(jù)關(guān)系的混亂,還會(huì)造成網(wǎng)絡(luò)擁塞,增加服務(wù)器壓力,顯然這個(gè)問題也是需要解決的。

三、函數(shù)防抖如何解決上述問題

根據(jù)上面對(duì)問題的分析,細(xì)細(xì)思索,可以想到如下解決方案。

函數(shù)防抖的要點(diǎn),是需要一個(gè) setTimeout 來(lái)輔助實(shí)現(xiàn),延遲運(yùn)行需要執(zhí)行的代碼。如果方法多次觸發(fā),則把上次記錄的延遲執(zhí)行代碼用 clearTimeout 清掉,重新開始計(jì)時(shí)。若計(jì)時(shí)期間事件沒有被重新觸發(fā),等延遲時(shí)間計(jì)時(shí)完畢,則執(zhí)行目標(biāo)代碼。

四、函數(shù)防抖的代碼實(shí)現(xiàn)

根據(jù)以上分析,我們對(duì) “函數(shù)防抖” 來(lái)進(jìn)行簡(jiǎn)單的代碼實(shí)現(xiàn),如下:

function debounce(fn,wait){ var timer = null; return function(){ if(timer !== null){ clearTimeout(timer); } timer = setTimeout(fn,wait); }} function handle(){ console.log(Math.random());} window.addEventListener('resize',debounce(handle,1000));

五、函數(shù)節(jié)流的使用場(chǎng)景

函數(shù)防抖一般用在什么情況之下呢?一般用在,連續(xù)的事件只需觸發(fā)一次回調(diào)的場(chǎng)合。具體有:

搜索框搜索輸入。只需用戶最后一次輸入完,再發(fā)送請(qǐng)求;

用戶名、手機(jī)號(hào)、郵箱輸入驗(yàn)證;

瀏覽器窗口大小改變后,只需窗口調(diào)整完后,再執(zhí)行 resize 事件中的代碼,防止重復(fù)渲染。

目前遇到過的用處就是這些,理解了原理與實(shí)現(xiàn)思路,小伙伴可以把它運(yùn)用在任何需要的場(chǎng)合,提高代碼質(zhì)量。

總結(jié)

函數(shù)防抖其實(shí)是分為 “立即執(zhí)行版” 和 “非立即執(zhí)行版” 的,根據(jù)字面意思就可以發(fā)現(xiàn)他們的差別,所謂立即執(zhí)行版就是 觸發(fā)事件后函數(shù)不會(huì)立即執(zhí)行,而是在 n 秒后執(zhí)行,如果在 n 秒內(nèi)又觸發(fā)了事件,則會(huì)重新計(jì)算函數(shù)執(zhí)行時(shí)間。 而 “非立即執(zhí)行版” 指的是 觸發(fā)事件后函數(shù)會(huì)立即執(zhí)行,然后 n 秒內(nèi)不觸發(fā)事件才能繼續(xù)執(zhí)行函數(shù)的效果。。

在開發(fā)過程中,我們需要根據(jù)不同的場(chǎng)景來(lái)決定我們需要使用哪一個(gè)版本的防抖函數(shù),一般來(lái)講上述的防抖函數(shù)都能滿足大部分的場(chǎng)景需求。但我們也可以將非立即執(zhí)行版和立即執(zhí)行版的防抖函數(shù)結(jié)合起來(lái),實(shí)現(xiàn)最終的雙劍合璧版本的防抖函數(shù),以下為小伙伴們做了簡(jiǎn)單的實(shí)現(xiàn):

/*** @desc 函數(shù)防抖---“立即執(zhí)行版本” 和 “非立即執(zhí)行版本” 的組合版本* @param func 需要執(zhí)行的函數(shù)* @param wait 延遲執(zhí)行時(shí)間(毫秒)* @param immediate---true 表立即執(zhí)行,false 表非立即執(zhí)行**/function debounce(func,wait,immediate) {let timer;return function () {let context = this;let args = arguments;if (timer) clearTimeout(timer);if (immediate) {var callNow = !timer;timer = setTimeout(() => {timer = null;}, wait)if (callNow) func.apply(context, args)} else {timer = setTimeout(function(){func.apply(context, args)}, wait);}}}function handle(){console.log(Math.random());}// window.addEventListener('mousemove',debounce(handle,1000,true)); // 調(diào)用立即執(zhí)行版本window.addEventListener('mousemove',debounce(handle,1000,false)); // 調(diào)用非立即執(zhí)行版本

以上就是詳解JS函數(shù)防抖的詳細(xì)內(nèi)容,更多關(guān)于JS函數(shù)防抖的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产精品18久久久久久久久久 | 久久99久久精品国产99热 | 免费看一级做a爰片久久 | 草草影院视频 | 99久久精品男女性高爱 | 日本特一级毛片免费视频 | 一区二区三区免费视频 www | 办公室紧身裙丝袜av在线 | 免费一区二区 | 永久黄网站色视频免费网站 | 久久久久国产精品免费网站 | 国产成人久久精品一区二区三区 | 在线日韩欧美一区二区三区 | 九九色视频在线观看 | 久久福利青草精品资源站 | 亚洲精选在线观看 | 欧美亚洲一区二区三区 | 国产精品久久久久久爽爽爽 | 亚洲加勒比久久88色综合1 | 国产亚洲精品国产一区 | 91成人爽a毛片一区二区 | 国产成人永久免费视频 | 欧美亚洲日本 | 亚洲综合小视频 | 日本道综合一本久久久88 | 92看片淫黄大片一级 | 国产三级在线观看免费 | 精品欧美高清一区二区免费 | 在线看欧美日韩中文字幕 | 黄色毛片视频校园交易 | 国产高清一国产免费软件 | 欧美日韩精品一区二区三区高清视频 | 日本精品1在线区 | 久久精品一区二区三区日韩 | 亚洲国产成人精品一区二区三区 | 国产精品爱久久久久久久三级 | 日韩一级一片 | 蘑菇午夜三级 | 曰本毛片va看到爽不卡 | 欧美一级毛片免费大全 | 9191精品国产免费不久久 |