9012年了哲戚,不做不懂函數(shù)防抖和函數(shù)節(jié)流的前端

概述

  • 函數(shù)防抖: 任務(wù)頻繁觸發(fā)的情況下奔滑,只有任務(wù)觸發(fā)的間隔超過指定間隔的時候,任務(wù)才會執(zhí)行顺少。
  • 函數(shù)節(jié)流: 指定時間間隔內(nèi)只會執(zhí)行一次任務(wù)朋其,原本可能會無時無刻執(zhí)行的函數(shù)王浴。

總之都是為了節(jié)省計算資源。

函數(shù)防抖(debounce)

場景:

  • 如今很多網(wǎng)站為了提高用戶體驗令宿,不會再輸入框失去焦點(diǎn)的時候再去判斷用戶名是否被占用叼耙,而是在輸入的時候就在判斷這個用戶名是否已被注冊。當(dāng)用戶輸入第一個字符后的一段時間內(nèi)如果還有字符輸入的話粒没,那就暫時不去請求判斷用戶名是否被占用筛婉。
  • 用戶注冊時候的手機(jī)號碼驗證和郵箱驗證

任務(wù)頻繁觸發(fā)的情況下,只有足夠的空閑時間癞松,才執(zhí)行代碼一次爽撒。

基本思想:通過閉包保存一個標(biāo)記(timeout)來保存 setTimeout 返回的值,每當(dāng)用戶輸入的時候把前一個 setTimeout clear 掉响蓉,然后又創(chuàng)建一個新的 setTimeout硕勿,這樣就能保證輸入字符后的 interval 間隔內(nèi)如果還有字符輸入的話,就不會執(zhí)行 fn 函數(shù)了枫甲。

函數(shù)防抖的要點(diǎn):也是需要一個setTimeout來輔助實(shí)現(xiàn)源武。延遲執(zhí)行需要跑的代碼。
如果方法多次觸發(fā)想幻,則把上次記錄的延遲執(zhí)行代碼用clearTimeout清掉粱栖,重新開始。
如果計時完畢脏毯,沒有方法進(jìn)來訪問觸發(fā)闹究,則執(zhí)行代碼。

// 函數(shù)防抖
function debounce(handlerFunc, interval = 300) {
    let timeout = null;
    return function () {
        clearTimeout(timeout);
        timeout = setTimeout(() => {
            handlerFunc.apply(this, arguments);
        }, interval);
    };
}
//綁定監(jiān)聽
window.addEventListener('resize', () => {
    debounce(this.onResize, 40)
}, false);

函數(shù)節(jié)流(throttle)

場景:過多的DOM相關(guān)操作可能會導(dǎo)致瀏覽器掛起食店,有時候甚至?xí)罎⒃佟1热纾簅nresize、onscroll吉嫩、mousemove等价认。

為了避免類似問題,就可以使用定時器對該函數(shù)進(jìn)行節(jié)流自娩。

基本思想:某些代碼不可以在沒有間斷的情況下連續(xù)重復(fù)執(zhí)行刻伊,就是一定時間內(nèi)函數(shù)只執(zhí)行一次。

第一次調(diào)用函數(shù)椒功,創(chuàng)建一個定時器捶箱,在指定的時間間隔之后運(yùn)行代碼。當(dāng)?shù)诙握{(diào)用函數(shù)時动漾,它會清除前一次的定時器并設(shè)置另一個丁屎。如果前一個定時器尚未執(zhí)行,就是將其替換為一個新的定時器旱眯,目的是只有在執(zhí)行函數(shù)的請求停止了一段時間之后才執(zhí)行晨川。

函數(shù)節(jié)流的要點(diǎn):聲明一個變量(resizeTimeout)當(dāng)標(biāo)志位证九,記錄當(dāng)前代碼是否在執(zhí)行。

  • 如果空閑共虑,則可以正常觸發(fā)方法執(zhí)行愧怜。
  • 如果代碼正在執(zhí)行,則取消這次方法執(zhí)行妈拌。

注意:只要是代碼周期性執(zhí)行的拥坛,都應(yīng)該使用節(jié)流,但是并不能控制請求執(zhí)行的速率尘分。

// 函數(shù)節(jié)流
function throttle(handlerFunc, timeout = 66) {
  let resizeTimeout;
  if (!resizeTimeout) {
    resizeTimeout = setTimeout(() => {
      resizeTimeout = null;
      handlerFunc();
      // The actualResizeHandler will execute at a rate of 15fps
    }, timeout);
  }
}
//綁定監(jiān)聽
window.addEventListener('resize', () => {
    throttle(this.onResize, 40)
}, false);

總結(jié)

函數(shù)防抖和函數(shù)節(jié)流的名字起得易混淆猜惋,要找技巧理解記憶,通俗易懂的說:

  • 函數(shù)防抖就像快遞小哥先將外賣攢著一起培愁,只有規(guī)定間隔內(nèi)沒有其他配單的時候著摔,才集中送一次。
  • 函數(shù)節(jié)流就像王者榮耀中人物釋放技能之后定续,需要CD冷卻時間過了谍咆,才可以再放。


    王者英雄王昭君

像這樣私股,是不是就好理解這兩個概念了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摹察,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庇茫,更是在濱河造成了極大的恐慌,老刑警劉巖螃成,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旦签,死亡現(xiàn)場離奇詭異,居然都是意外死亡寸宏,警方通過查閱死者的電腦和手機(jī)宁炫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氮凝,“玉大人羔巢,你說我怎么就攤上這事≌终螅” “怎么了竿秆?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稿壁。 經(jīng)常有香客問我幽钢,道長,這世上最難降的妖魔是什么傅是? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任匪燕,我火速辦了婚禮蕾羊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帽驯。我一直安慰自己龟再,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布尼变。 她就那樣靜靜地躺著利凑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪享甸。 梳的紋絲不亂的頭發(fā)上截碴,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音蛉威,去河邊找鬼日丹。 笑死,一個胖子當(dāng)著我的面吹牛蚯嫌,可吹牛的內(nèi)容都是我干的哲虾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼择示,長吁一口氣:“原來是場噩夢啊……” “哼束凑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栅盲,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汪诉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谈秫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扒寄,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年拟烫,在試婚紗的時候發(fā)現(xiàn)自己被綠了该编。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡硕淑,死狀恐怖课竣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情置媳,我是刑警寧澤于樟,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拇囊,受9級特大地震影響隔披,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寂拆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一奢米、第九天 我趴在偏房一處隱蔽的房頂上張望抓韩。 院中可真熱鬧,春花似錦鬓长、人聲如沸谒拴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽英上。三九已至,卻和暖如春啤覆,著一層夾襖步出監(jiān)牢的瞬間苍日,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工窗声, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留相恃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓笨觅,卻偏偏與公主長得像拦耐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子见剩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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