聊聊函數(shù)節(jié)流(throttle)和函數(shù)去抖(debounce)

講在前面

進騰訊快半個多月了肮街,說實話在這半個多月里見識了許多新的東西风题,比如VR,AR,WebGL沛硅,AI技術等等眼刃。作為技術男的我對此十分感興趣,連玩了八年的DNF都放棄了摇肌,這需要多么大的勇氣和決心鸟整。廢話不多說了,想寫這邊文章是因為今天做項目的過程中遇到一個坑朦蕴,其實以前就遇到過篮条,只是沒有好好總結下,這個問題就是如何優(yōu)化window的resize和scroll事件吩抓。就算工作在忙涉茧,我覺得都要學會總結,總結也是一個學習和提升的過程疹娶。

問題引申

其實我們可以將這個問題進行擴大伴栓,不僅僅局限于window的scroll和resize事件,由它引申出來的問題是我們?nèi)绾谓鉀Q讓一個函數(shù)不頻繁的觸發(fā)雨饺。

解決辦法

目前業(yè)界對于這個問題有兩種不同的方法钳垮,一個是函數(shù)節(jié)流(throttle),另外一個就是函數(shù)去抖(debounce)额港。

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

函數(shù)節(jié)流:就是函數(shù)按照一個周期執(zhí)行饺窿,例如給window綁定一個resize事件之后,只要window大小改變就打印1移斩,如果不采用函數(shù)節(jié)流肚医,當我們將窗口調(diào)節(jié)的時候發(fā)現(xiàn)控制臺一直打印1,但是使用了函數(shù)節(jié)流后我們會發(fā)現(xiàn)調(diào)節(jié)的過程中向瓷,每隔一段時間才打印1肠套。
下面是函數(shù)節(jié)流的簡單實現(xiàn)。

var throttle = function(delay, cb) {
    var startTime = Date.now();
    return function() {
        var currTime = Date.now();
        if (currTime - startTime > delay) {
            cb();
            startTime = currTime;
        }
    }
}

函數(shù)去抖

函數(shù)去抖:就是當事件觸發(fā)之后猖任,必須等待某一個時間之后你稚,回調(diào)函數(shù)才會執(zhí)行,假若再等待的時間內(nèi)朱躺,事件又觸發(fā)了則等待時間刷新刁赖。還是上面那個例子,如果我們一直改變窗口大小室琢,則不會打印1乾闰,只有當我們停止改變窗口大小并等待一段時間后,才會打印1盈滴。
下面是函數(shù)去抖的簡單實現(xiàn)。

var debounce = function(delay, cb) {
    var timer;
    return function() {
        if (timer) clearTimeout(timer);
        timer = setTimeout(function() {
            cb();
        }, delay);
    }
}

最后

其實以上這兩個的思想還蠻好理解的,兩種方法均使用了閉包(緩存變量)巢钓,但是這是簡單的實現(xiàn)病苗。
目前l(fā)odash和underscore這兩個現(xiàn)成的js庫都對以上方法進行了實現(xiàn),而且封裝的更好症汹,功能更完善硫朦,有興趣的同學可以閱讀下它的源碼,我抽時間也會去閱讀一下的背镇。最后希望大家再前端的道路上越走越遠咬展。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞒斩,隨后出現(xiàn)的幾起案子破婆,更是在濱河造成了極大的恐慌,老刑警劉巖胸囱,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷舀,死亡現(xiàn)場離奇詭異,居然都是意外死亡烹笔,警方通過查閱死者的電腦和手機裳扯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谤职,“玉大人饰豺,你說我怎么就攤上這事≡黍冢” “怎么了哟忍?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陷寝。 經(jīng)常有香客問我锅很,道長,這世上最難降的妖魔是什么凤跑? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任爆安,我火速辦了婚禮,結果婚禮上仔引,老公的妹妹穿的比我還像新娘扔仓。我一直安慰自己,他們只是感情好咖耘,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布翘簇。 她就那樣靜靜地躺著,像睡著了一般儿倒。 火紅的嫁衣襯著肌膚如雪版保。 梳的紋絲不亂的頭發(fā)上呜笑,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音彻犁,去河邊找鬼叫胁。 笑死,一個胖子當著我的面吹牛汞幢,可吹牛的內(nèi)容都是我干的驼鹅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼森篷,長吁一口氣:“原來是場噩夢啊……” “哼输钩!你這毒婦竟也來了?” 一聲冷哼從身側響起仲智,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤买乃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坎藐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體为牍,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年岩馍,在試婚紗的時候發(fā)現(xiàn)自己被綠了碉咆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛀恩,死狀恐怖疫铜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情双谆,我是刑警寧澤壳咕,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站顽馋,受9級特大地震影響谓厘,放射性物質發(fā)生泄漏。R本人自食惡果不足惜寸谜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一竟稳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熊痴,春花似錦他爸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巾陕,卻和暖如春讨跟,著一層夾襖步出監(jiān)牢的瞬間纪他,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工许赃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留止喷,地道東北人馆类。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓混聊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乾巧。 傳聞我的和親對象是個殘疾皇子句喜,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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