摘要:函數節流和去抖的出現場景,一般都伴隨著客戶端的事件監聽。函數節流的核心是,讓一個函數不要執行得太頻繁,減少一些過快的調用來節流。
概述
也是好久沒更新 源碼解讀,看著房價蹭蹭暴漲,心里也是五味雜陳,對未來充滿恐懼和迷茫 ...(敢問一句你們上岸了嗎)
言歸正傳,今天要介紹的是 underscore 中兩個重要的方法,函數節流和函數去抖。這篇文章不會涉及具體的代碼實現(關于代碼實現請期待下文),會從零開始介紹函數節流和函數去抖的概念,辨析應用場景。為什么我對這兩個方法情有獨鐘要花大篇幅去介紹?因為就是它們帶我入了「underscore 源碼解讀」的坑(詳見 一次發現underscore源碼bug的經歷以及對學術界『拿來主義』的思考)。
函數節流和去抖的出現場景,一般都伴隨著客戶端 DOM 的事件監聽。舉個例子,實現一個原生的拖拽功能(不能用 H5 Drag&Drop API),需要一路監聽 mousemove 事件,在回調中獲取元素當前位置,然后重置 dom 的位置(樣式改變)。如果我們不加以控制,每移動一定像素而觸發的回調數量是會非常驚人的,回調中又伴隨著 DOM 操作,繼而引發瀏覽器的重排與重繪,性能差的瀏覽器可能就會直接假死,這樣的用戶體驗是非常糟糕的。我們需要做的是降低觸發回調的頻率,比如讓它 500ms 觸發一次,或者 200ms,甚至 100ms,這個閾值不能太大,太大了拖拽就會失真,也不能太小,太小了低版本瀏覽器可能就會假死,這樣的解決方案就是函數節流,英文名字叫「throttle」。函數節流的核心是,讓一個函數不要執行得太頻繁,減少一些過快的調用來節流。
說完函數節流,再看它的好基友函數去抖(debounce)。思考這樣一個場景,對于瀏覽器窗口,每做一次 resize 操作,發送一個請求,很顯然,我們需要監聽 resize 事件,但是和 mousemove 一樣,每縮小(或者放大)一次瀏覽器,實際上會觸發 N 多次的 resize 事件,用節流?節流只能保證定時觸發,我們一次就好,這就要用去抖。簡單的說,函數去抖就是對于一定時間段的連續的函數調用,只讓其執行一次。
throttle 應用場景函數節流有哪些應用場景?哪些時候我們需要間隔一定時間觸發回調來控制函數調用頻率?
DOM 元素的拖拽功能實現(mousemove)
射擊游戲的 mousedown/keydown 事件(單位時間只能發射一顆子彈)
計算鼠標移動的距離(mousemove)
Canvas 模擬畫板功能(mousemove)
搜索聯想(keyup)
監聽滾動事件判斷是否到頁面底部自動加載更多:給 scroll 加了 debounce 后,只有用戶停止滾動后,才會判斷是否到了頁面底部;如果是 throttle 的話,只要頁面滾動就會間隔一段時間判斷一次 https://github.com/hanzichi/u...
debounce 應用場景函數去抖有哪些應用場景?哪些時候對于連續的事件響應我們只需要執行一次回調?
每次 resize/scroll 觸發統計事件
文本輸入的驗證(連續輸入文字后發送 AJAX 請求進行驗證,驗證一次就好)
小結函數節流和函數去抖的核心其實就是限制某一個方法被頻繁觸發,而一個方法之所以會被頻繁觸發,大多數情況下是因為 DOM 事件的監聽回調,而這也是函數節流以及去抖多數情況下的應用場景。至于函數節流和去抖方法的具體代碼實現以及調用方式,下文我們再做分享。
附另外兩篇關于 underscore 函數節流以及去抖源碼剖析的文章
underscore 函數去抖的實現
underscore 函數節流的實現
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87956.html
摘要:節流保證在一定時間內,只能觸發一次。我們在嘗試一下去抖消抖,消除抖動,感覺這個更好聽有沒有什么現成的上的一次發現源碼的經歷以及對學術界拿來主義的思考函數節流和函數去抖應用場景辨析函數去抖的實現 開篇先提幾個問題? 1.做搜索框的時候你使用什么事件?change?blur?keyup?你想要的效果是什么? 2.scroll事件怎么就觸發?是滾一段距離觸發一次?還是滾一圈觸發一次?還是滾...
閱讀 1433·2021-09-03 10:29
閱讀 3458·2019-08-29 16:24
閱讀 2010·2019-08-29 11:03
閱讀 1410·2019-08-26 13:52
閱讀 2925·2019-08-26 11:36
閱讀 2786·2019-08-23 17:19
閱讀 560·2019-08-23 17:14
閱讀 812·2019-08-23 13:59