前端防抖與節流

2021-10-03 06:23:10 字數 1332 閱讀 6245

在某些高頻度觸發的事件中繫結操作需要用到節流函式。

最常見的打個栗子,如果要在window的滾動事件中傳送ajax請求載入更多資料。

有需要的童鞋可以把此段複製到html檔案中自行檢視效果。

我們來看看此時頁面的表現效果。

此時我們可以看到console.log(1)被高頻度觸發。如果此時scroll裡面觸發的是ajax請求,那麼在頁面滾動的一小段時間內,就會傳送45次ajax請求。效能開銷不容小覷。

對此問題,封裝節流函式如下  

function throttle(fn,time)

}

此時再來看看頁面表現

防抖函式的實現原理,throttle函式第乙個引數為要執行的函式,第二個引數為間隔時間。那麼如何理解這個間隔時間呢。

假設我們在滾動時觸發了100次滾動事件,那麼就執行了100次throttle函式,第一次執行throttle,清除定時器。然後設定定時器。此時的console.log(1)會在1s之後執行,但是此時執行了第二次throttle函式,它又清除了第乙個定時器。生成了第二個定時器。。。。。。,到最後執行第一百次throttle函式,他清除了第99個定時器,設定第一百個定時器。此時throttle全部執行完成,console.log(1)會在1s之後執行。

那麼可以這樣理解。throttle的第乙個引數為待執行函式,第二個引數為停止滾動後幾秒內執行函式。上述栗子中的throttle(function(),1000)表示停止滾動後1s內執行console.log(1)。同時表示著,如果你停止滾動後,在1s內再次滾動,待執行函式也不會執行。它嚴格執行條件為停止滾動,1s內。

那麼函式防抖有什麼缺陷,從它的實現原理來看它的缺陷也是顯而易見的。

同時它內部也使用到了防抖函式,可以說是防抖pro版本。

貼上**。供童鞋們自行參悟其中奧妙。

function throttle(func, wait, mustrun)  else 

};};

function realfunc(args)

window.addeventlistener("scroll", throttle(function(), 1000,500))

前端防抖節流

防抖和節流是前端最基本的效能優化,在繫結監聽事件onmousemove,onmousewheel時,如果觸發過於頻繁,在一次觸發尚未執行完時又再次觸發,就會造成瀏覽器丟幀,進而影響使用者體驗,防抖和節流就是為了解決這個問題。防抖 在事件觸發n秒後再執行這個函式,如果在n秒內又觸發則重新計時 func...

節流與防抖

瀏覽器中某些計算和處理要比其他的昂貴,例如在瀏覽器中操作dom比非dom互動需要更多的記憶體和cpu的事件,連續嘗試進行過多的dom相關操作可能ui導致瀏覽器掛起,有時甚至會崩潰。尤其在ie中使用onresize事件處理程式的時候容易發生,當調整瀏覽器大小的時候,該事件會連續觸發。在onresize...

防抖與節流

防抖 當事件持續觸發,一定時間內沒有觸發事件函式處理一次。比如輸入框的ajax請求做模糊查詢 節流 當時間持續觸發,在一秒內只能觸發一次。比如滾動條持續向下滾動,載入更多資料 function debounce fn,wait function throttle func,delay functio...