摘要:函數(shù)節(jié)流和去抖的出現(xiàn)場景,一般都伴隨著客戶端的事件監(jiān)聽。函數(shù)節(jié)流的核心是,讓一個函數(shù)不要執(zhí)行得太頻繁,減少一些過快的調(diào)用來節(jié)流。
概述
也是好久沒更新 源碼解讀,看著房價蹭蹭暴漲,心里也是五味雜陳,對未來充滿恐懼和迷茫 ...(敢問一句你們上岸了嗎)
言歸正傳,今天要介紹的是 underscore 中兩個重要的方法,函數(shù)節(jié)流和函數(shù)去抖。這篇文章不會涉及具體的代碼實現(xiàn)(關(guān)于代碼實現(xiàn)請期待下文),會從零開始介紹函數(shù)節(jié)流和函數(shù)去抖的概念,辨析應(yīng)用場景。為什么我對這兩個方法情有獨鐘要花大篇幅去介紹?因為就是它們帶我入了「underscore 源碼解讀」的坑(詳見 一次發(fā)現(xiàn)underscore源碼bug的經(jīng)歷以及對學(xué)術(shù)界『拿來主義』的思考)。
函數(shù)節(jié)流和去抖的出現(xiàn)場景,一般都伴隨著客戶端 DOM 的事件監(jiān)聽。舉個例子,實現(xiàn)一個原生的拖拽功能(不能用 H5 Drag&Drop API),需要一路監(jiān)聽 mousemove 事件,在回調(diào)中獲取元素當(dāng)前位置,然后重置 dom 的位置(樣式改變)。如果我們不加以控制,每移動一定像素而觸發(fā)的回調(diào)數(shù)量是會非常驚人的,回調(diào)中又伴隨著 DOM 操作,繼而引發(fā)瀏覽器的重排與重繪,性能差的瀏覽器可能就會直接假死,這樣的用戶體驗是非常糟糕的。我們需要做的是降低觸發(fā)回調(diào)的頻率,比如讓它 500ms 觸發(fā)一次,或者 200ms,甚至 100ms,這個閾值不能太大,太大了拖拽就會失真,也不能太小,太小了低版本瀏覽器可能就會假死,這樣的解決方案就是函數(shù)節(jié)流,英文名字叫「throttle」。函數(shù)節(jié)流的核心是,讓一個函數(shù)不要執(zhí)行得太頻繁,減少一些過快的調(diào)用來節(jié)流。
說完函數(shù)節(jié)流,再看它的好基友函數(shù)去抖(debounce)。思考這樣一個場景,對于瀏覽器窗口,每做一次 resize 操作,發(fā)送一個請求,很顯然,我們需要監(jiān)聽 resize 事件,但是和 mousemove 一樣,每縮?。ɑ蛘叻糯螅┮淮螢g覽器,實際上會觸發(fā) N 多次的 resize 事件,用節(jié)流?節(jié)流只能保證定時觸發(fā),我們一次就好,這就要用去抖。簡單的說,函數(shù)去抖就是對于一定時間段的連續(xù)的函數(shù)調(diào)用,只讓其執(zhí)行一次。
throttle 應(yīng)用場景函數(shù)節(jié)流有哪些應(yīng)用場景?哪些時候我們需要間隔一定時間觸發(fā)回調(diào)來控制函數(shù)調(diào)用頻率?
DOM 元素的拖拽功能實現(xiàn)(mousemove)
射擊游戲的 mousedown/keydown 事件(單位時間只能發(fā)射一顆子彈)
計算鼠標(biāo)移動的距離(mousemove)
Canvas 模擬畫板功能(mousemove)
搜索聯(lián)想(keyup)
監(jiān)聽滾動事件判斷是否到頁面底部自動加載更多:給 scroll 加了 debounce 后,只有用戶停止?jié)L動后,才會判斷是否到了頁面底部;如果是 throttle 的話,只要頁面滾動就會間隔一段時間判斷一次 https://github.com/hanzichi/u...
debounce 應(yīng)用場景函數(shù)去抖有哪些應(yīng)用場景?哪些時候?qū)τ谶B續(xù)的事件響應(yīng)我們只需要執(zhí)行一次回調(diào)?
每次 resize/scroll 觸發(fā)統(tǒng)計事件
文本輸入的驗證(連續(xù)輸入文字后發(fā)送 AJAX 請求進(jìn)行驗證,驗證一次就好)
小結(jié)函數(shù)節(jié)流和函數(shù)去抖的核心其實就是限制某一個方法被頻繁觸發(fā),而一個方法之所以會被頻繁觸發(fā),大多數(shù)情況下是因為 DOM 事件的監(jiān)聽回調(diào),而這也是函數(shù)節(jié)流以及去抖多數(shù)情況下的應(yīng)用場景。至于函數(shù)節(jié)流和去抖方法的具體代碼實現(xiàn)以及調(diào)用方式,下文我們再做分享。
附另外兩篇關(guān)于 underscore 函數(shù)節(jié)流以及去抖源碼剖析的文章
underscore 函數(shù)去抖的實現(xiàn)
underscore 函數(shù)節(jié)流的實現(xiàn)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/87956.html
摘要:節(jié)流保證在一定時間內(nèi),只能觸發(fā)一次。我們在嘗試一下去抖消抖,消除抖動,感覺這個更好聽有沒有什么現(xiàn)成的上的一次發(fā)現(xiàn)源碼的經(jīng)歷以及對學(xué)術(shù)界拿來主義的思考函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場景辨析函數(shù)去抖的實現(xiàn) 開篇先提幾個問題? 1.做搜索框的時候你使用什么事件?change?blur?keyup?你想要的效果是什么? 2.scroll事件怎么就觸發(fā)?是滾一段距離觸發(fā)一次?還是滾一圈觸發(fā)一次?還是滾...
摘要:當(dāng)?shù)诙握{(diào)用該函數(shù)時,它會清除前一次的定時器并設(shè)置另一個。然而,如果前一個定時器尚未執(zhí)行,其實就是將其替換為一個新的定時器,然后延遲一定時間再執(zhí)行。參考文章函數(shù)節(jié)流與函數(shù)防抖函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場景辨析函數(shù)節(jié)流函數(shù)防抖實現(xiàn)原理分析 前言 事件的觸發(fā)權(quán)很多時候都屬于用戶,有些情況下會產(chǎn)生問題: 向后臺發(fā)送數(shù)據(jù),用戶頻繁觸發(fā),對服務(wù)器造成壓力 一些瀏覽器事件:window.onresi...
摘要:當(dāng)?shù)诙握{(diào)用該函數(shù)時,它會清除前一次的定時器并設(shè)置另一個。然而,如果前一個定時器尚未執(zhí)行,其實就是將其替換為一個新的定時器,然后延遲一定時間再執(zhí)行。參考文章函數(shù)節(jié)流與函數(shù)防抖函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場景辨析函數(shù)節(jié)流函數(shù)防抖實現(xiàn)原理分析 前言 事件的觸發(fā)權(quán)很多時候都屬于用戶,有些情況下會產(chǎn)生問題: 向后臺發(fā)送數(shù)據(jù),用戶頻繁觸發(fā),對服務(wù)器造成壓力 一些瀏覽器事件:window.onresi...
摘要:當(dāng)?shù)诙握{(diào)用該函數(shù)時,它會清除前一次的定時器并設(shè)置另一個。然而,如果前一個定時器尚未執(zhí)行,其實就是將其替換為一個新的定時器,然后延遲一定時間再執(zhí)行。參考文章函數(shù)節(jié)流與函數(shù)防抖函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場景辨析函數(shù)節(jié)流函數(shù)防抖實現(xiàn)原理分析 前言 事件的觸發(fā)權(quán)很多時候都屬于用戶,有些情況下會產(chǎn)生問題: 向后臺發(fā)送數(shù)據(jù),用戶頻繁觸發(fā),對服務(wù)器造成壓力 一些瀏覽器事件:window.onresi...
摘要:如果本次定時器沒有被清除,時間到后就會自然執(zhí)行事件處理函數(shù)。綁定去抖后的事件回調(diào)函數(shù)綁定回調(diào)函數(shù)的屬性方法,點擊頁面,重置去抖效果異步請求清空上一次事件觸發(fā)的定時器重置為從而下一次事件觸發(fā)就能立即執(zhí)行。 一、前言 為什么會有去抖和節(jié)流這類工具函數(shù)? 在用戶和前端頁面的交互過程中,很多操作的觸發(fā)頻率非常高,比如鼠標(biāo)移動 mousemove 事件, 滾動條滑動 scroll 事件, 輸...
閱讀 1498·2021-09-03 10:29
閱讀 3522·2019-08-29 16:24
閱讀 2191·2019-08-29 11:03
閱讀 1496·2019-08-26 13:52
閱讀 3007·2019-08-26 11:36
閱讀 2860·2019-08-23 17:19
閱讀 614·2019-08-23 17:14
閱讀 868·2019-08-23 13:59