JavaScript之節(jié)流與防抖

背景

我們?cè)陂_發(fā)的過程中會(huì)經(jīng)常使用如scroll、resize盅视、touchmove等事件捐名,如果正常綁定事件處理函數(shù)的話,有可能在很短的時(shí)間內(nèi)多次連續(xù)觸發(fā)事件闹击,十分影響性能镶蹋。
因此針對(duì)這類事件要進(jìn)行節(jié)流或者防抖處理

節(jié)流

節(jié)流的意思是,在規(guī)定的時(shí)間內(nèi)只會(huì)觸發(fā)一次函數(shù)拇砰,如我們?cè)O(shè)置函數(shù)500ms觸發(fā)一次梅忌,之后你無論你觸發(fā)了多少次函數(shù),在這個(gè)時(shí)間內(nèi)也只會(huì)有一次執(zhí)行效果

先來看一個(gè)例子

https://codepen.io/wclimb/pen/gKWLpO/

我們看到使用了節(jié)流的在1000ms內(nèi)只觸發(fā)了一次除破,而沒有使用節(jié)流的則頻繁觸發(fā)了調(diào)用的函數(shù)

接下來看看代碼實(shí)現(xiàn)
v1 第一次不觸發(fā),不傳參實(shí)現(xiàn)

function throttle(fn,interval){
    var timer;
    return function(){
        if(timer){
            return
        }
        timer = setTimeout(() => {
            clearTimeout(timer)
            timer = null
            fn()
        }, interval || 1000);
    }   
}

效果是實(shí)現(xiàn)了琼腔,但是我在嘗試在執(zhí)行函數(shù)里console.log(this)瑰枫,結(jié)果發(fā)現(xiàn)this指向的是window,而且還發(fā)現(xiàn)我們不能傳遞參數(shù)丹莲,下面就來改進(jìn)一下

v2 第一次觸發(fā)函數(shù)光坝,接收參數(shù)

function throttle(fn,interval){
    var timer,
        isFirst = true;
    return function(){
        var args = arguments,
            that = this;
        if(isFirst){
            fn.apply(that,args)
            return isFirst = false
        }
        if(timer){
            return
        }
        timer = setTimeout(() => {
            clearTimeout(timer)
            timer = null
            fn.apply(that,args)
        }, interval || 1000);
    }   
}

防抖

防抖的意思是無論你觸發(fā)多少次函數(shù),只會(huì)觸發(fā)最后一次函數(shù)甥材。最常用的就是在表單提交的時(shí)候盯另,用戶可能會(huì)一段時(shí)間內(nèi)點(diǎn)擊很多次,這個(gè)時(shí)候可以增加防抖處理洲赵,我們只需要最后一次觸發(fā)的事件

先來看一個(gè)例子

https://codepen.io/wclimb/pen/pKPeyv/

我們看到使用了防抖的方框鸳惯,無論你在里面觸發(fā)了多少次函數(shù)商蕴,都只會(huì)觸發(fā)最后的那一次函數(shù),而沒有使用防抖的則頻繁觸發(fā)了調(diào)用的函數(shù)

v1 第一次不觸發(fā)函數(shù)

function debounce(fn,interval){
    var timer;
    return function(){
        var args = arguments,
            that = this;
        if(timer){
            clearTimeout(timer)
            timer = null
        }
        timer = setTimeout(() => {
            fn.apply(null,args)
        }, interval || 1000);
    }
}

上面這段代碼仍然可以正常執(zhí)行芝发,但是我們并沒有指定他的this

v2 第一次就觸發(fā)函數(shù)

function debounce(fn,interval){
    var timer,
        isFirst  = true,
            can = false;
    return function(){
        var args = arguments,
            that = this;
        if(timer){
            clearTimeout(timer)
            timer = null
        }
        if(isFirst){
            fn.apply(that,args)
            isFirst = false
            setTimeout(() => {
                can = true
            }, interval || 1000);
        }else if(can){
            timer = setTimeout(() => {
                fn.apply(null,args)
            }, interval || 1000);
        }
    }
}

如有雷同绪商,純屬抄我(開玩笑)

如有錯(cuò)誤,還望指正辅鲸,僅供參考

GitHub:wclimb

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末格郁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子独悴,更是在濱河造成了極大的恐慌例书,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刻炒,死亡現(xiàn)場(chǎng)離奇詭異决采,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)落蝙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門织狐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筏勒,你說我怎么就攤上這事移迫。” “怎么了管行?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵厨埋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我捐顷,道長(zhǎng)荡陷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任迅涮,我火速辦了婚禮废赞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叮姑。我一直安慰自己唉地,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布传透。 她就那樣靜靜地躺著耘沼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朱盐。 梳的紋絲不亂的頭發(fā)上群嗤,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音兵琳,去河邊找鬼狂秘。 笑死骇径,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赃绊。 我是一名探鬼主播既峡,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碧查!你這毒婦竟也來了运敢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤忠售,失蹤者是張志新(化名)和其女友劉穎传惠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稻扬,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卦方,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泰佳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盼砍。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逝她,靈堂內(nèi)的尸體忽然破棺而出浇坐,到底是詐尸還是另有隱情,我是刑警寧澤黔宛,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布近刘,位于F島的核電站,受9級(jí)特大地震影響臀晃,放射性物質(zhì)發(fā)生泄漏觉渴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一徽惋、第九天 我趴在偏房一處隱蔽的房頂上張望案淋。 院中可真熱鬧,春花似錦险绘、人聲如沸哎迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翔烁,卻和暖如春渺氧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹬屹。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工侣背, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留白华,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓贩耐,卻偏偏與公主長(zhǎng)得像弧腥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子潮太,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 在進(jìn)行窗口的resize管搪、scroll,輸入框內(nèi)容校驗(yàn)等操作時(shí)铡买,如果事件處理函數(shù)調(diào)用的頻率無限制更鲁,會(huì)加重瀏覽器的負(fù)...
    iqing2012閱讀 788評(píng)論 0 1
  • 在日常開發(fā)中,我們經(jīng)常能夠碰到以下工作場(chǎng)景: 對(duì)提交按鈕進(jìn)行變態(tài)的點(diǎn)擊壓力測(cè)試輸入框內(nèi)容的實(shí)時(shí)校驗(yàn)(譬如驗(yàn)證用戶名...
    叫我小徐閱讀 993評(píng)論 0 5
  • 最近在研究頁面渲染及web動(dòng)畫的性能問題奇钞,以及拜讀《CSS SECRET》(CSS揭秘)這本大作澡为。 本文主要想談?wù)?..
    108N8閱讀 1,080評(píng)論 0 11
  • 《難尋舊路》 渾余悸歹敢于創(chuàng), 川成依離立別愁景埃。 各由冥故孤山底媒至, 歪風(fēng)印洗凡城窗。 被建陰陽五行幻谷徙, 相變并止值...
    春城怡景閱讀 517評(píng)論 2 16
  • HTTP協(xié)議 HTTP協(xié)議:超文本傳輸協(xié)議(Hypertext Transfer Protocol) http協(xié)議...
    yangxm閱讀 2,784評(píng)論 0 6