函數(shù)防抖和函數(shù)節(jié)流

說到「函數(shù)防抖」和「函數(shù)節(jié)流」,兩者其實概念比較相似。

1.「函數(shù)防抖」(debounce)
通俗來說乘粒,就是把「多個信號」轉(zhuǎn)化為「單個信號」,在Javascript中伤塌,如果一個事件頻繁發(fā)生灯萍,事件在觸發(fā)后過一段事件才執(zhí)行,但是如果在這一段時間內(nèi)每聪,我們又觸發(fā)了這個事件旦棉,則會重新計時。

應(yīng)用場景:表單驗證或者提交

我們回顧下在提交表單中药薯,如果我們填好信息后绑洛,點擊「提交」按鈕,就應(yīng)該發(fā)送請求給后端了童本,但是真屯。。穷娱。绑蔫。运沦。如果你所謂的“手抖”了一下,一不小心點了10下或者更多下呢配深?那是不是就要發(fā)送很多個請求了茶袒?為了從技術(shù)上防止這種情況的出現(xiàn),于是乎有了「函數(shù)防抖」凉馆。

實現(xiàn)思路:
我們將目標(biāo)方法包裝進(jìn)setTimeout中薪寓,這個方法是一個事件的回調(diào)函數(shù),如果一定時間內(nèi)澜共,這個事件不停地被觸發(fā)向叉,那么這個回調(diào)函數(shù)就一直不被執(zhí)行,我們是通過clearTimeout來消除這個setTimeout嗦董,這樣我們就可以把一定時間內(nèi)的連續(xù)事件刪除母谎,等到過了一定時間時間,且這個時間內(nèi)不再有事件觸發(fā)京革,我們就執(zhí)行這個回調(diào)函數(shù)奇唤。

代碼(表單驗證例子):

// html代碼:<input id="input" type="text">
input.oninput = debounce(fn);

// 目標(biāo)方法
function fn() {
    console.log('用戶輸入了');
}

function debounce(callback, interval = 1000) { //默認(rèn)這個「一定時間」為1秒
    let timeId = null;
    return function() {
        if(timeId) {
            clearTimeout(timeId);
        }
        timeId = setTimeout(() => {
            callback();
        }, interval)
    }
}

說明:上述代碼,我們在輸入框中如果只輸入1次匹摇,過了1秒后就會log出“用戶輸入”了咬扇。但是如果我們連續(xù)輸入,就算過了1秒也沒有l(wèi)og出“用戶輸入”廊勃,直到停止輸入1秒后懈贺,才會出現(xiàn)。這就大大減少了我們不必要的請求坡垫,節(jié)約資源梭灿,提升用戶體驗。

2.「函數(shù)節(jié)流」(throttle)
為啥說兩者相似呢冰悠,都是為了避免資源浪費(fèi)堡妒,只不過兩者有些區(qū)別,上述「函數(shù)防抖」是等待用戶不再觸發(fā)事件一定時間后執(zhí)行回調(diào)函數(shù)溉卓,而「函數(shù)節(jié)流」是一定事件內(nèi)如果多次觸發(fā)事件只執(zhí)行一次回調(diào)函數(shù)皮迟。(如果事件一直觸發(fā)就相當(dāng)于每隔一定時間執(zhí)行一次回調(diào))

打個比方:
一個外賣小哥,在從商家拿外賣送到A地的诵,如果他拿到后立即送往A地万栅,送到一半佑钾,發(fā)現(xiàn)該商家又有一單外賣同樣送到A地西疤,你說他是先把第一單送完,還是先去取第二單然后一起送到A地休溶?聽起來是不是很坑代赁。但是如果我們這樣規(guī)劃扰她,我們?nèi)×说谝粏危覀冊谏碳夷堑?分鐘芭碍,看看還有沒有新的訂單(多次事件觸發(fā))徒役,如果有則一起接下,5分鐘后管他還有沒有新的訂單窖壕,都要去送了(不然就要過時被投訴啦S俏稹!U胺怼T)

應(yīng)用場景:

  • DOM元素拖拽
  • 判斷scroll是否到底

代碼(以scroll為例):

window.onscroll = throttle(fn);

function fn() {
    // 目標(biāo)函數(shù):主要是判斷是否到底部了
    let range = document.body.clientHeight - window.innerHeight - window.scrollY;
    if(range <= 0) {
        console.log('到底了呀!');
    }
}

function throttle(callback, interval = 300) {
    // 默認(rèn)每300毫秒來判斷是否到底了
    let run = true;
    return function() {
        if(!run) return;
        run = false;
        setTimeout(() => {
            callback();
            run = true;
        }, interval);
    };
}

此時你會發(fā)現(xiàn)雖然都是多次觸發(fā)事件速勇,只執(zhí)行一次晌砾。「函數(shù)防抖」是等到用戶不觸發(fā)事件后才執(zhí)行一次回調(diào)函數(shù)烦磁,而「函數(shù)節(jié)流」是過了一定時間养匈,無論是否還有事件觸發(fā),都要先執(zhí)行一次回調(diào)函數(shù)都伪。

參考:
1.https://zhuanlan.zhihu.com/p/57006134
2.https://zhuanlan.zhihu.com/p/38313717

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呕乎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子陨晶,更是在濱河造成了極大的恐慌楣嘁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珍逸,死亡現(xiàn)場離奇詭異逐虚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谆膳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門叭爱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漱病,你說我怎么就攤上這事买雾。” “怎么了杨帽?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵漓穿,是天一觀的道長。 經(jīng)常有香客問我注盈,道長晃危,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮僚饭,結(jié)果婚禮上震叮,老公的妹妹穿的比我還像新娘。我一直安慰自己鳍鸵,他們只是感情好苇瓣,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偿乖,像睡著了一般击罪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贪薪,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天外邓,我揣著相機(jī)與錄音,去河邊找鬼古掏。 笑死损话,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的槽唾。 我是一名探鬼主播丧枪,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼庞萍!你這毒婦竟也來了拧烦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钝计,失蹤者是張志新(化名)和其女友劉穎恋博,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體私恬,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡债沮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了本鸣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疫衩。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荣德,靈堂內(nèi)的尸體忽然破棺而出闷煤,到底是詐尸還是另有隱情,我是刑警寧澤涮瞻,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布鲤拿,位于F島的核電站,受9級特大地震影響署咽,放射性物質(zhì)發(fā)生泄漏近顷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幕庐。 院中可真熱鬧,春花似錦家淤、人聲如沸异剥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冤寿。三九已至,卻和暖如春青伤,著一層夾襖步出監(jiān)牢的瞬間督怜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工狠角, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留号杠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓丰歌,卻偏偏與公主長得像姨蟋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子立帖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355