函數(shù)防抖纸肉、節(jié)流

防抖和節(jié)流的目的都是為了減少不必要的計(jì)算铣猩,不浪費(fèi)資源揖铜,只在適合的時(shí)候再進(jìn)行觸發(fā)計(jì)算。

1. 函數(shù)防抖(debounce)

  1. 定義
    在事件被觸發(fā)n秒后再執(zhí)行回調(diào)达皿,如果在這n秒內(nèi)又被觸發(fā)天吓,則重新計(jì)時(shí);典型的案例就是輸入搜索:輸入結(jié)束后n秒才進(jìn)行搜索請求峦椰,n秒內(nèi)又輸入的內(nèi)容龄寞,就重新計(jì)時(shí)。

  2. 實(shí)現(xiàn)原理
    函數(shù)防抖的基本思想是設(shè)置一個(gè)定時(shí)器汤功,在指定時(shí)間間隔內(nèi)運(yùn)行代碼時(shí)清楚上一次的定時(shí)器物邑,并設(shè)置另一個(gè)定時(shí)器,知道函數(shù)請求停止并超過時(shí)間間隔才會執(zhí)行滔金。

  3. 使用場景
    文本框輸入搜索(連續(xù)輸入時(shí)避免多次請求接口)

  4. 代碼實(shí)現(xiàn)

    /*
     * debounce:實(shí)現(xiàn)函數(shù)的防抖(目的是頻繁觸發(fā)中只執(zhí)行一次)
     *  @params
     *     func:需要執(zhí)行的函數(shù)
     *     wait:檢測防抖的間隔頻率
     *     immediate:是否是立即執(zhí)行(如果為TRUE是控制第一次觸發(fā)的時(shí)候就執(zhí)行函數(shù)色解,默認(rèn)FALSE是以最后一次觸發(fā)為準(zhǔn))
     *  @return
     *     可被調(diào)用執(zhí)行的函數(shù)
     */
    function debounce(func, wait = 500, immediate = false) {
        let timer = null;
        return function anonymous(...params) {
            let now = immediate && !timer;
            clearTimeout(timer);
            timer = setTimeout(() => {
                timer = null;
                // 執(zhí)行函數(shù):注意保持THIS和參數(shù)的完整度
                !immediate ? func.call(this, ...params) : null;
            }, wait);
            now ? func.call(this, ...params) : null;
        };
    }

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

  1. 定義
    規(guī)定在一個(gè)單位時(shí)間內(nèi),只能觸發(fā)一次函數(shù)餐茵,如果這個(gè)單位時(shí)間內(nèi)觸發(fā)多次函數(shù)科阎,只有一次生效; 典型的案例就是鼠標(biāo)不斷點(diǎn)擊觸發(fā)忿族,規(guī)定在n秒內(nèi)多次點(diǎn)擊只有一次生效萧恕。

  2. 實(shí)現(xiàn)原理
    其原理是用時(shí)間戳來判斷是否已到回調(diào)該執(zhí)行時(shí)間,記錄上次執(zhí)行的時(shí)間戳肠阱,然后每次觸發(fā) scroll 事件執(zhí)行回調(diào)票唆,回調(diào)中判斷當(dāng)前時(shí)間戳距離上次執(zhí)行時(shí)間戳的間隔是否已經(jīng)到達(dá) 規(guī)定時(shí)間段,如果是屹徘,則執(zhí)行走趋,并更新上次執(zhí)行的時(shí)間戳,

使用場景

resize噪伊、scroll簿煌、mousemove等事件觸發(fā)監(jiān)聽
  1. 代碼實(shí)現(xiàn)
    /*
     * throttle:實(shí)現(xiàn)函數(shù)的節(jié)流(目的是頻繁觸發(fā)中縮減頻率)
     *   @params
     *      func:需要執(zhí)行的函數(shù)
     *      wait:自己設(shè)定的間隔時(shí)間(頻率)
     *   @return
     *      可被調(diào)用執(zhí)行的函數(shù)
     */
    function throttle(func, wait = 500) {
        let timer = null,
            previous = 0; //記錄上一次操作時(shí)間
        return function anonymous(...params) {
            let now = new Date(), //當(dāng)前操作的時(shí)間
                remaining = wait - (now - previous);
            if (remaining <= 0) {
                // 兩次間隔時(shí)間超過頻率:把方法執(zhí)行即可
                clearTimeout(timer);
                timer = null;
                previous = now;
                func.call(this, ...params);
            } else if (!timer) {
                // 兩次間隔時(shí)間沒有超過頻率氮唯,說明還沒有達(dá)到觸發(fā)標(biāo)準(zhǔn)呢,設(shè)置定時(shí)器等待即可(還差多久等多久)
                timer = setTimeout(() => {
                    clearTimeout(timer);
                    timer = null;
                    previous = new Date();
                    func.call(this, ...params);
                }, remaining);
            }
        };
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姨伟,一起剝皮案震驚了整個(gè)濱河市惩琉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夺荒,老刑警劉巖瞒渠,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異技扼,居然都是意外死亡伍玖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門剿吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窍箍,“玉大人,你說我怎么就攤上這事丽旅∫” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵榄笙,是天一觀的道長邪狞。 經(jīng)常有香客問我,道長办斑,這世上最難降的妖魔是什么赃绊? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任疚颊,我火速辦了婚禮,結(jié)果婚禮上秧骑,老公的妹妹穿的比我還像新娘罪郊。我一直安慰自己蠕蚜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布悔橄。 她就那樣靜靜地躺著靶累,像睡著了一般。 火紅的嫁衣襯著肌膚如雪癣疟。 梳的紋絲不亂的頭發(fā)上挣柬,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音睛挚,去河邊找鬼邪蛔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扎狱,可吹牛的內(nèi)容都是我干的侧到。 我是一名探鬼主播勃教,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匠抗!你這毒婦竟也來了故源?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤汞贸,失蹤者是張志新(化名)和其女友劉穎绳军,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體著蛙,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡删铃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踏堡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猎唁。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顷蟆,靈堂內(nèi)的尸體忽然破棺而出诫隅,到底是詐尸還是另有隱情,我是刑警寧澤帐偎,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布逐纬,位于F島的核電站,受9級特大地震影響削樊,放射性物質(zhì)發(fā)生泄漏豁生。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一漫贞、第九天 我趴在偏房一處隱蔽的房頂上張望甸箱。 院中可真熱鬧,春花似錦迅脐、人聲如沸芍殖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌骏。三九已至,卻和暖如春隐锭,著一層夾襖步出監(jiān)牢的瞬間窃躲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工钦睡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒂窒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像刘绣,于是被迫代替她去往敵國和親樱溉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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

  • 本篇課題纬凤,或許早已是爛大街的解讀文章福贞。不過春招系列面試下來,不少伙伴們還是似懂非懂地栽倒在(~面試官~)深意的笑容...
    以樂之名閱讀 1,772評論 0 9
  • 防抖(debounce):在指定的時(shí)間 n 秒后執(zhí)行回調(diào)停士,如果在計(jì)算時(shí)間的過程中又被觸發(fā)挖帘,則從新開始計(jì)算時(shí)間 fu...
    sharon_007閱讀 752評論 0 0
  • 在前端開發(fā)的過程中,我們經(jīng)常會需要綁定一些持續(xù)觸發(fā)的事件恋技,如 resize拇舀、scroll、mousemove 等等...
    Grace_feb3閱讀 391評論 0 0
  • 轉(zhuǎn)自 簡書 什么是函數(shù)防抖和節(jié)流 在前端開發(fā)過程中蜻底,我們經(jīng)常會遇到需要綁定一些持續(xù)性出發(fā)事件的場景.例如resiz...
    TouchMe丶閱讀 394評論 1 0
  • 本文摘自這里骄崩,通俗易懂。防抖和節(jié)流在前端和客戶端開發(fā)中經(jīng)常會用到薄辅,而且適用場景還挺多要拂,大多數(shù)成熟的第三方庫都有提供...
    nuannuan_nuan閱讀 815評論 0 1