前端節流和防抖(上)

2021-10-04 19:30:45 字數 1868 閱讀 7038

節流和防抖,共性都是對短時間會大量觸發瀏覽器事件的優化
//防抖debounce

/* 在使用者觸發事件的時間間隔小於(規定時間段)時候才觸發函式

簡單來說,就是使用者只要觸發事件時間比設定的時間段短,那函式就不會觸發

個人粗鄙理解(只要我動得夠快,你就不會觸發)

*/

class

="inp"

type

="text"

/>

//應用場景,我要在使用者輸入停止1s後,才列印輸出使用者的輸入內容

// 防抖函式 (第一版,簡易版)

function

debounce

(fn, delay)

// 開規定事件的定時器

timer =

settimeout((

)=>

, delay)}}

//獲取元素

let input = document.

queryselector

('.inp');

//展示

function

showval()

//繫結事件

input.oninput =

debounce

(showval,

1000

);

但是簡易版中,使用this的時候就會有問題
function

showval()

//原因在於在閉包返回函式後,this已經指向了window

//解決方法

// 防抖函式 (第二版,修正this版)

function

debounce

(fn, delay)

// 開規定事件的定時器

timer =

settimeout((

)=>

, delay)

}}

在第二版中,我們修正了this,但是對於事件引數並沒有修正
function

showval

(e)

使用第二部的**執行上面函式時候會報錯

這個時候就需要第三版

// 防抖函式 (第三版,修正event引數)

function

debounce

(fn, delay)

// 開規定事件的定時器

timer =

settimeout((

)=>

, delay)

}}

我們可以輸出arguments看一下=_=

很明顯arguments是乙個引數列表

fn.call

(content,param1,param2...

)fn.

(conent,

[param1,param2...])

//第三部 使用call傳遞也是可以的

fn.(this

,...args)

;//使用es6 的...語法將引數列表解構出來

前端節流和防抖(下)

在 限定時間段內 只觸發一次函式,比如 規定時間間隔為1s 那這個函式在1s內只執行1次 不管使用者觸發多少次事件,我觸發函式後,1s後才能重新觸發class inp type text let input document.queryselector inp 間隔1s時間,輸出使用者在input框...

前端防抖節流

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

前端的防抖和節流

防抖和節流都是優化高頻率執行js的方法 dom 結構 123js 結構 var jh 1 var jhbt document.getelementbyid jh 防抖 只有等空閒時間才去執行,比如搜尋框功能,如果快速一直按鍵,難道每輸入乙個鍵就去後台匹配然後渲染嗎?等使用者輸入完整關鍵字在去後台匹配...