防抖和節(jié)流

防抖和節(jié)流

為什么需要防抖和節(jié)流

在前端開發(fā)的過程中衡楞,我們經(jīng)常會需要綁定一些持續(xù)觸發(fā)的事件,如 resize敦姻、scroll瘾境、mousemove 等等,但有些時候我們并不希望在事件持續(xù)觸發(fā)的過程中那么頻繁地去執(zhí)行函數(shù)镰惦。

防抖(debounce)

所謂防抖迷守,就是指觸發(fā)事件后在 n 秒內(nèi)函數(shù)只能執(zhí)行一次,如果在 n 秒內(nèi)又觸發(fā)了事件旺入,則會重新計算函數(shù)執(zhí)行時間兑凿。

  • 非立即執(zhí)行版
// 非立即執(zhí)行版的意思是觸發(fā)事件后函數(shù)不會立即執(zhí)行,而是在 n 秒后執(zhí)行茵瘾,如果在 n 秒內(nèi)又觸發(fā)了事件礼华,則會重新計算函數(shù)執(zhí)行時間。
function debounce(func, wait) {
    let timeout;
    return function () {
        let context = this;
        let args = arguments;

        if (timeout) clearTimeout(timeout);
        
        timeout = setTimeout(() => {
            func.apply(context, args)
        }, wait);
    }
}
// 上述防抖函數(shù)的代碼還需要注意的是 this 和 參數(shù)的傳遞
// 防抖函數(shù)的代碼使用這兩行代碼來獲取 this 和 參數(shù)拗秘,是為了讓 debounce 函數(shù)最終返回的函數(shù) this 指向不變以及依舊能接受到 e 參數(shù)圣絮。

content.onmousemove = debounce(count,1000);
  • 立即執(zhí)行版
// 立即執(zhí)行版的意思是觸發(fā)事件后函數(shù)會立即執(zhí)行,然后 n 秒內(nèi)不觸發(fā)事件才能繼續(xù)執(zhí)行函數(shù)的效果雕旨。
function debounce(func,wait) {
    let timeout;
    return function () {
        let context = this;
        let args = arguments;

        if (timeout) clearTimeout(timeout);

        let callNow = !timeout;
        timeout = setTimeout(() => {
            timeout = null;
        }, wait)

        if (callNow) func.apply(context, args)
    }
}
  • 雙劍合璧版
/**
 * @desc 函數(shù)防抖
 * @param func 函數(shù)
 * @param wait 延遲執(zhí)行毫秒數(shù)
 * @param immediate true 表立即執(zhí)行扮匠,false 表非立即執(zhí)行
 */
function debounce(func,wait,immediate) {
    let timeout;

    return function () {
        let context = this;
        let args = arguments;

        if (timeout) clearTimeout(timeout);
        if (immediate) {
            var callNow = !timeout;
            timeout = setTimeout(() => {
                timeout = null;
            }, wait)
            if (callNow) func.apply(context, args)
        }
        else {
            timeout = setTimeout(function(){
                func.apply(context, args)
            }, wait);
        }
    }
}

節(jié)流

所謂節(jié)流捧请,就是指連續(xù)觸發(fā)事件但是在 n 秒中只執(zhí)行一次函數(shù)。節(jié)流會稀釋函數(shù)的執(zhí)行頻率棒搜。

  • 時間戳版
// 在持續(xù)觸發(fā)事件的過程中疹蛉,函數(shù)會立即執(zhí)行,并且每 1s 執(zhí)行一次力麸。
function throttle(func, wait) {
    let previous = 0;
    return function() {
        let now = Date.now();
        let context = this;
        let args = arguments;
        if (now - previous > wait) {
            func.apply(context, args);
            previous = now;
        }
    }
}

content.onmousemove = throttle(count,1000);
  • 定時器版
// 在持續(xù)觸發(fā)事件的過程中可款,函數(shù)不會立即執(zhí)行,并且每 1s 執(zhí)行一次末盔,在停止觸發(fā)事件后筑舅,函數(shù)還會再執(zhí)行一次
function throttle(func, wait) {
    let timeout;
    return function() {
        let context = this;
        let args = arguments;
        if (!timeout) {
            timeout = setTimeout(() => {
                timeout = null;
                func.apply(context, args)
            }, wait)
        }

    }
}

我們應(yīng)該可以很容易的發(fā)現(xiàn)座慰,其實時間戳版和定時器版的節(jié)流函數(shù)的區(qū)別就是陨舱,時間戳版的函數(shù)觸發(fā)是在時間段內(nèi)開始的時候,而定時器版的函數(shù)觸發(fā)是在時間段內(nèi)結(jié)束的時候版仔。

  • 雙劍合璧版
/**
 * @desc 函數(shù)節(jié)流
 * @param func 函數(shù)
 * @param wait 延遲執(zhí)行毫秒數(shù)
 * @param type 1 表時間戳版游盲,2 表定時器版
 */
function throttle(func, wait ,type) {
    if(type===1){
        let previous = 0;
    }else if(type===2){
        let timeout;
    }
    return function() {
        let context = this;
        let args = arguments;
        if(type===1){
            let now = Date.now();

            if (now - previous > wait) {
                func.apply(context, args);
                previous = now;
            }
        }else if(type===2){
            if (!timeout) {
                timeout = setTimeout(() => {
                    timeout = null;
                    func.apply(context, args)
                }, wait)
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛮粮,隨后出現(xiàn)的幾起案子益缎,更是在濱河造成了極大的恐慌,老刑警劉巖然想,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莺奔,死亡現(xiàn)場離奇詭異,居然都是意外死亡变泄,警方通過查閱死者的電腦和手機令哟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妨蛹,“玉大人屏富,你說我怎么就攤上這事⊥苈保” “怎么了狠半?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颤难。 經(jīng)常有香客問我神年,道長,這世上最難降的妖魔是什么行嗤? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任已日,我火速辦了婚禮,結(jié)果婚禮上昂验,老公的妹妹穿的比我還像新娘捂敌。我一直安慰自己艾扮,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布占婉。 她就那樣靜靜地躺著泡嘴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逆济。 梳的紋絲不亂的頭發(fā)上酌予,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音奖慌,去河邊找鬼抛虫。 笑死选脊,一個胖子當著我的面吹牛港准,可吹牛的內(nèi)容都是我干的凸椿。 我是一名探鬼主播漠魏,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼沿猜,長吁一口氣:“原來是場噩夢啊……” “哼掸驱!你這毒婦竟也來了工碾?” 一聲冷哼從身側(cè)響起庵楷,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤啦逆,失蹤者是張志新(化名)和其女友劉穎伞矩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夏志,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡乃坤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沟蔑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湿诊。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溉贿,靈堂內(nèi)的尸體忽然破棺而出枫吧,到底是詐尸還是另有隱情,我是刑警寧澤宇色,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布九杂,位于F島的核電站,受9級特大地震影響宣蠕,放射性物質(zhì)發(fā)生泄漏例隆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一抢蚀、第九天 我趴在偏房一處隱蔽的房頂上張望镀层。 院中可真熱鬧,春花似錦、人聲如沸唱逢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坞古。三九已至备韧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痪枫,已是汗流浹背织堂。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奶陈,地道東北人易阳。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像吃粒,于是被迫代替她去往敵國和親潦俺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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

  • 第一次觀察自己是在心里有計劃和目標的声搁,所以第一次觀察感悟很深刻黑竞。助教和孩子的對話都是充滿慈愛和平和。還有助教會引導...
    張鳳茹閱讀 138評論 0 0
  • 以Chrome為例 軟件安裝步驟 1??下載并安裝JDKhttps://www.oracle.com/techne...
    無罪的壞人閱讀 1,350評論 0 2
  • 十三年之后的綠園中學扎酷,青草茂密如初檐涝,校園主干道兩旁枝葉繁茂的榕樹愈發(fā)老勁。在我這歸來者眼中法挨,與記憶里的青青翠色相比...
    我住深海別墅閱讀 180評論 0 0
  • 此去經(jīng)年 / 這個城市的六月似乎比五月過的快一些谁榜。 大學畢業(yè)了,似乎要來點兒傷感的前奏凡纳,外加看似熱鬧的中場窃植,最后是...
    一只肉肉的海米丶閱讀 356評論 0 0