防抖與節(jié)流

前言

首先這是來自一道小組的面試題目茶行,當小組伙伴出了這個題目,我首先是詫異這是啥高級玩意,后來被解釋到就是為了防止連續(xù)點擊呵俏,我心里想這不是很簡單的策略就可以限制的嗎,還有一個新的名詞滔灶,太專業(yè)了普碎。第一時間思考了一下,如何實現(xiàn)录平,是取最后一次還是定時取第一次麻车?貌似在很多場景都是合理的,比如input輸入更新斗这,和按鈕的連續(xù)點擊....

看了幾個博客动猬,加上之前的腦補,是時候總結一下了.....

防抖

函數(shù)防抖(debounce)(連續(xù)觸發(fā)只發(fā)生一次)

理解:連續(xù)觸發(fā)一事件表箭,取最后一次觸發(fā)并讓事件發(fā)生赁咙,這里的限制是要有指定的時間間隔,簡言之一定時間間隔沒有再次觸發(fā)就執(zhí)行一次處理函數(shù)免钻。

案例:連續(xù)點擊按鈕序目,并不是立即執(zhí)行按鈕按下要觸發(fā)的處理函數(shù),當1s內(nèi)沒有觸發(fā)新的點擊事件時伯襟,才會延時觸發(fā)一次處理函數(shù)猿涨。

定義:

// 定義
function debounce(func, wait) {
  let timeout = null
  return function() {
    if(timeout !== null) clearTimeout(timeout)     
    timeout = setTimeout(func, wait);
  }
}

使用:

// html
<div  @click="onClick($event)" > </div>

// js
function handle() {   
  console.log(Math.random())
}

// 申請一個按鈕處理函數(shù)
function btnClick = debounce(handle, 1000)

// 按鈕點擊事件
function onClick(){
  btnClick()
}

實際使用就是:

  • 定義處理函數(shù)和時間間隔
  • 申請新的防抖函數(shù)
  • 在點擊事件中調(diào)用“申請的防抖函數(shù)”

不通用的快速寫法

// html
<div  @click="onClick($event)" > </div>

// js
// timeout定義在onClick外層作用域
let timeout = null
// 按鈕點擊事件
function onClick(){
    if(timeout !== null) clearTimeout(timeout)     
    timeout = setTimeout(
      function(){
        // 處理策略
      }, 
     wait);
}

函數(shù)節(jié)流(throttle)(連續(xù)觸發(fā),均勻發(fā)生多次姆怪,即使最后一個時間間隔只觸發(fā)一次也保證發(fā)生)

理解:連續(xù)觸發(fā)一事件且都會執(zhí)行叛赚,會造成資源浪費、頁面卡頓等稽揭,防抖可以解決這一問題俺附,但是防抖沒有保證事件在一定時間內(nèi)肯定能發(fā)生一下,所以會有函數(shù)節(jié)流的概念溪掀,函數(shù)節(jié)流就是保證指定間隔里真正處理的事件最多只有一次事镣,即在規(guī)定時間內(nèi)減少函數(shù)執(zhí)行次數(shù)。
案例:連續(xù)點擊按鈕揪胃,并不是立即執(zhí)行按鈕按下要觸發(fā)的處理函數(shù)璃哟,當1s內(nèi)都沒有實際處理就觸發(fā)處理函數(shù),簡單說連續(xù)觸發(fā)保證1s內(nèi)發(fā)生一次喊递,沒有事件就不觸發(fā)随闪。

定義:

function throttle(func, delay, duration){
    var timer = null;
    var begin = new Date();    
    return function(){                
        var context = this, args = arguments;
        var current = new Date();        
        clearTimeout(timer);
        if(current - begin >= duration){
            func.apply(context, args);
            begin = current;
        }else{
            timer = setTimeout(function(){
                func.apply(context, args);
            },delay);
        }
    }
}

使用:

// html
<div  @click="onClick($event)" > </div>

// js
function handle() {   
  console.log(Math.random())
}

// 申請一個按鈕處理函數(shù)
function btnClick = throttle(handle, 100,500)

// 按鈕點擊事件
function onClick(){
  btnClick()
}

總結

函數(shù)防抖(debounce)(連續(xù)觸發(fā)只發(fā)生一次)
函數(shù)節(jié)流(throttle)(連續(xù)觸發(fā)骚勘,均勻發(fā)生多次铐伴,即使最后一個時間間隔只觸發(fā)一次也保證發(fā)生)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撮奏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子当宴,更是在濱河造成了極大的恐慌畜吊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户矢,死亡現(xiàn)場離奇詭異玲献,居然都是意外死亡,警方通過查閱死者的電腦和手機逗嫡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門青自,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驱证,你說我怎么就攤上這事延窜。” “怎么了抹锄?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵逆瑞,是天一觀的道長。 經(jīng)常有香客問我伙单,道長获高,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任吻育,我火速辦了婚禮念秧,結果婚禮上,老公的妹妹穿的比我還像新娘布疼。我一直安慰自己摊趾,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布游两。 她就那樣靜靜地躺著砾层,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贱案。 梳的紋絲不亂的頭發(fā)上肛炮,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音宝踪,去河邊找鬼侨糟。 笑死,一個胖子當著我的面吹牛肴沫,可吹牛的內(nèi)容都是我干的粟害。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颤芬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起站蝠,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汰具,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菱魔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體留荔,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年澜倦,在試婚紗的時候發(fā)現(xiàn)自己被綠了聚蝶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡藻治,死狀恐怖碘勉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桩卵,我是刑警寧澤验靡,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雏节,受9級特大地震影響胜嗓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钩乍,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一辞州、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寥粹,春花似錦变过、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妄痪,卻和暖如春哈雏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衫生。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工裳瘪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罪针。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓彭羹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泪酱。 傳聞我的和親對象是個殘疾皇子派殷,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容