js防抖和節流的區別及實現方式

2021-10-09 20:18:51 字數 1434 閱讀 9664

函式防抖(debounce):觸發高頻事件後n秒內函式只會執行一次,如果n秒內高頻事件再次被觸發,則重新計算時間。

函式節流(throttle):高頻事件觸發,但在n秒內只會執行一次,所以節流會稀釋函式的執行頻率。

函式節流(throttle)與 函式防抖(debounce)都是為了限制函式的執行頻次,以優化函式觸發頻率過高導致的響應速度跟不上觸發頻率,出現延遲,假死或卡頓的現象。

比如如下的情況:

//防抖debounce**:

function

debounce

(fn,delay)

, delay);}

;}// 處理函式

function

handle()

//滾動事件

window.

addeventlistener

('scroll'

,debounce

(handle,

500)

);

實現方式:每次觸發事件時,如果當前有等待執行的延時函式,則直接return

//節流throttle**:

function

throttle

(fn,delay)

, delay);}

;}function

sayhi

(e)window.

addeventlistener

('resize'

,throttle

(sayhi,

500)

);

可以拿我們平時坐電梯為例來形象地表述二者的區別

函式防抖:如果有人進電梯(觸發事件),那電梯將在10秒鐘後出發(執行事件***),這時如果又有人進電梯了(在10秒內再次觸發該事件),我們又得等10秒再出發(重新計時)。

函式節流 :保證如果電梯第乙個人進來後,10秒後準時運送一次,這個時間從第乙個人上電梯開始計時,不等待,如果沒有人,則不執行。

函式節流不管事件觸發有多頻繁,都會保證在規定時間內一定會執行一次真正的事件處理函式,而函式防抖只是在最後一次事件後才觸發一次函式。 比如在頁面的無限載入場景下,我們需要使用者在滾動頁面時,每隔一段時間發一次 ajax 請求,而不是在使用者停下滾動頁面操作時才去請求資料。這樣的場景,就適合用節流技術來實現。

函式防抖:將多次操作合併為一次操作進行。原理是維護乙個計時器,規定在delay時間後觸發函式,但是在delay時間內再次觸發的話,就會取消之前的計時器而重新設定。這樣一來,只有最後一次操作能被觸發。

函式節流:使得一定時間內只觸發一次函式。原理是通過判斷是否有延遲呼叫函式未執行。

防抖和節流的區別及實現方式

防抖 debounce 觸發高頻事件後n秒內函式只會執行一次,如果n秒內高頻事件再次被觸發,則重新計算時間。節流 throttle 高頻事件觸發,但在n秒內只會執行一次,所以節流會稀釋函式的執行頻率。目的 節流 throttle 與 防抖 debounce 都是為了限制函式的執行頻次,以優化函式觸發...

節流和防抖 區別和實現

實現 函式節流 開始會執行一次,持續觸發事件的話,每隔wait時間執行一次 應用場景mousemove,scroll等會連續執行的事件,比較適合應用於動畫相關的場景。param fn 需要節流的函式 param wait 間隔時間 export function throttle fn,wait 1...

js防抖和節流

在進行視窗的resize scroll,輸入框內容校驗等操作時,如果事件處理函式呼叫的頻率無限制,會加重瀏覽器的負擔,導致使用者體驗非常糟糕。此時我們可以採用debounce 防抖 和throttle 節流 的方式來減少呼叫頻率,同時又不影響實際效果。函式防抖 函式防抖 debounce 當持續觸發...