亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

詳解JS函數(shù)防抖

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

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

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

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

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

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

除此之外,短時間內重復的 ajax 調用不僅會造成數(shù)據(jù)關系的混亂,還會造成網(wǎng)絡擁塞,增加服務器壓力,顯然這個問題也是需要解決的。

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

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

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

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

根據(jù)以上分析,我們對 “函數(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é)流的使用場景

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

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

用戶名、手機號、郵箱輸入驗證;

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

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

總結

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

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

/*** @desc 函數(shù)防抖---“立即執(zhí)行版本” 和 “非立即執(zhí)行版本” 的組合版本* @param func 需要執(zhí)行的函數(shù)* @param wait 延遲執(zhí)行時間(毫秒)* @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)); // 調用立即執(zhí)行版本window.addEventListener('mousemove',debounce(handle,1000,false)); // 調用非立即執(zhí)行版本

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

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 久久香蕉国产在产线看观看 | 国产人成精品午夜在线观看 | 国产成人91精品 | 国产精品玖玖玖在线观看 | 亚洲高清视频在线 | 黄色片免 | 欧美日韩乱码毛片免费观看 | 午夜国产视频 | 亚洲精品免费观看 | 看真人视频一级毛片 | 成年免费大片黄在线观看岛国 | 久久全国免费久久青青小草 | 黄色小视频观看 | 欧美在线免费观看视频 | 国产真人毛片一级视频 | 特级做a爰片毛片免费看一区 | 国产成人高清视频免费播放 | 亚洲精品国产第一区二区三区 | 国产成人精品亚洲午夜麻豆 | 一级做a爰片欧美aaaa | 国产在线观看自拍 | 最近中文日本字幕免费完整 | 国产在线一区二区三区欧美 | 国产精品久久久久三级 | bbixx在线观看 | 日韩精品久久久久久久电影99爱 | 日韩美女毛片 | 99热国产这里只有精品9九 | 老头边吃奶边做边爱 | 女人毛片a级大学毛片免费 女人毛片在线 | 久久精品精品 | 亚洲综合区小说区激情区噜噜 | 成人淫片免费视频95视频 | 成人精品视频在线观看播放 | 国产破处在线视频 | 欧美r级限制禁片在线观看 欧美va在线高清 | 国产一区二区视频在线观看 | 性欧美一级毛片在线播放 | 欧美国产亚洲一区二区三区 | 国产黄色一级网站 | 欧美呦女 |