1. 程式人生 > >函式去抖和函式節流

函式去抖和函式節流

為什麼會有會出現debouncethrottle
以下場景往往由於事件頻繁被觸發,而重複執行DOM操作、資源載入等重行為、會導致UI停頓甚至瀏覽器崩潰。
1、window物件的resize、scroll和拖拽時的mousemove事件
2、射擊遊戲中的mousedown、keydown事件

3、類似百度搜索提示keyup事件

問題分析
DOM操作比非DOM互動需要更多的記憶體和CPU時間,連續嘗試進行過多的DOM相關操作可能會導致瀏覽器掛起,有時候甚至會崩潰。

       實際上對於windowresize事件,實際需求大多為停止改變大小n毫秒後執行後續處理、而拖拽的mousemove事件函式則是以一定的頻率執行後續處理。比如拖拽事件、可以在使用者能夠接受的範圍內更改程式碼的執行

頻率、mousemove的觸發頻率大概為10ms一次,而當我們設定執行時間為50ms一次時,使用者也不會察覺、這樣我們就可以在不影響使用者體驗的前提下,提高效能。

針對這兩種需求就出現了debouncethrottle兩種解決辦法

什麼是debouncethrottle
函式去抖debounce
如果用手指一直按住一個彈簧,它將不會彈起直到你鬆手為止。
也就是說:
當呼叫動作n毫秒後,才會執行該動作,若在這n毫秒內又呼叫此動作則
將重新計算執行時間,如此往復,直到不再呼叫該動作,函式才會執行。
函式節流throttle
如果將水龍頭擰緊直到水是以水滴的形式流出,那你會發現每隔一段時間,就會有一滴水流出。
也就是說:

預先設定一個執行週期,當呼叫動作的時刻大於等於執行週期則執行該動作,然後進入下一個新週期。

原理分析
Debounce原理是通過重複呼叫函式,清空定時器,在函式不再被呼叫的時候觸發一次。
throttle原理是通過判斷時間間隔、間隔一定的時間頻率呼叫函式。

throttledebounce均是通過減少實際邏輯處理過程的執行來提高事件處理函式執行效能的手段,並沒有實質上減少事件的觸發次數。

案例
比如:搜尋框繫結keyoress事件、假設我想查詢“windows phone”,它包含13個字元,而我輸入完成只花了1秒鐘,那麼在這1秒內,呼叫了13次查詢方法。這是一件非常恐怖的事情,那麼更好的方法是,我們希望使用者已經輸入完成,或者正在等待提示(也許他懶得再輸入後面的內容)的時候,再查詢匹配關鍵字。


比如:模擬百度搜索框,實現輸入關鍵詞的同時下拉選單中的相關資訊改變
這個就沒有必要每10ms執行一次搜尋,也並不能等到使用者輸入結束之後才提示,此時就需要使用函式節流,間隔固定的時間下拉選單的提示資訊更新一次

underscore.js

http://www.bootcss.com/p/underscore/#throttle
Underscore.js是一個 JavaScript工具庫,它提供了一整套函數語言程式設計的實用功能,
彌補了jQuery 沒有實現的功能,同時又是 Backbone 必不可少的部分。


相關推薦

函式函式節流

為什麼會有會出現debounce和throttle以下場景往往由於事件頻繁被觸發,而重複執行DOM操作、資源載入等重行為、會導致UI停頓甚至瀏覽器崩潰。1、window物件的resize、scroll和拖拽時的mousemove事件2、射擊遊戲中的mousedown、key

移動端事件(四)—— 函式函式節流

函式防抖   在對於函式高頻次執行時,只執行一次。   有兩種情況:     1.尾部執行:高頻次觸發時,只執行最後一次     2.頭部執行:高頻次觸發時,只執行第一次   尾部執行實現很簡單,先設一個定時器,一開始觸發的時候我不執行,稍微延遲一會後再執行,當你下次執行時,我把上一次的定時器消失,

移動端事件(五)—— 函式函式節流的封裝

我們瞭解了函式防抖與函式節流的思路後,我們現在來將他們封裝起來,提高程式碼複用性。 今天直接上菜   cb 要處理防抖的函式  time 預設的高頻間隔時間  isStart 是否在頭部執行 函式防抖封裝:呼叫debounce 函式,返回一個處理過防抖的函式 <!DOCTYPE html> &l

JavaScript函式節流函式知識點學習

概念 節流 (throttle) 讓一個函式不要執行的太頻繁,減少執行過快的呼叫,叫節流 去抖 (debounce) 去抖就是對於一定時間段的連續的函式呼叫,只讓其執行一次 throttle 應用場景 DOM 元素的拖拽功能實現(mousemove) 射擊遊戲的

函式(debounce)函式節流(throttle)

目的 以下場景往往由於事件頻繁被觸發,因而頻繁執行DOM操作、資源載入等重行為,導致UI停頓甚至瀏覽器崩潰。 window物件的resize、scroll事件 拖拽時的mousemove事件 射擊遊戲中的mousedown、keydown事件 文字輸入、自

JavaScript 函式節流函式

概念 節流 (throttle) 讓一個函式不要執行的太頻繁,減少執行過快的呼叫,叫節流 去抖 (debounce) 去抖就是對於一定時間段的連續的函式呼叫,只讓其執行一次 throttle 應用場景 DOM 元素的拖拽功能實現(mousemove) 射擊遊戲的 m

工具函式--防節流

防抖和節流 視窗的resize、scroll,輸入框內容校驗等操作時,如果這些操作處理函式較為複雜或頁面頻繁重渲染等操作時,如果事件觸發的頻率無限制,會加重瀏覽器的負擔,導致使用者體驗非常糟糕。此時我們可以採用debounce(防抖)和throttle(節流)

函式節流

在前端開發的過程中,我們經常會需要繫結一些持續觸發的事件,如 resize、scroll、mousemove 等等,但有些時候我們並不希望在事件持續觸發的過程中那麼頻繁地去執行函式。 通常這種情況下我們怎麼去解決的呢?一般來講,防抖和節流是比較好的解決方案。 讓我們先來看

【js】什麼是函式節流函式

函式節流 意思:節省流量,不會一直訪問。 | 指定時間內不執行,指定時間後執行。 | 一段時間內只執行一次 場景: 比如控制遊戲人物攻擊,時間內就算按得很快,也只能砍一刀,過後才能砍第二刀。 搜尋引擎聯想詞。搜尋框的oninput事件節流。 引數:一個函式,一個時間 返回:一個函式 對比時間進行

JS debouncethrottle 節流

wait span 上彈 技術分享 -1 布局 blog strong 導致 JS中的高頻事件有scroll recize mouseover。 如果頻繁觸發事件綁定函數,會導致瀏覽器性能上的損失。 因此我們通常會添加延遲執行的邏輯。 在underscore.js裏面有

前端開發的函式函式節流

最近在開發中遇到一個問題,如果在很短的事件內連續點選同一個按鈕,按鈕的事件會觸發多次,在網上查了一下資料發現undescore.js 這個工具外掛,裡面提供了這樣兩個函式 debounce 和  thr

前端常見原生方法的實現(bind,promise,new,extends,深拷貝,函式函式節流

前端原生方法的實現,這裡寫一下常見的一些實現: 1.bind Function.prototype.bind2 = function (context) { var self = this; returnfunction () { self.apply(conte

debounce(防)throttle(節流)

www. ret tro 方法 以及 arguments 執行 沒有 舉例 最近由於項目為了修復快速雙擊發送兩次請求得BUG,應用了vue中的debounce,對於其實現產生了一點好奇,於是學習了關於debounce和throttle的一些具體實現方法,具體內容參考http

函式過載(overload)函式重寫(override)的基本規則

本文由Markdown語法編輯器編輯完成。 1. 前言:   在C++中有兩個非常容易混淆的概念,分別是函式過載(overload)和函式重寫(overwirte)。雖然只相差一個字,但是它們兩者之間的差別還是非常巨大的。而通過深入瞭解這兩個概念的區別,

Python3函式傳參函式形參定義方式

1、函式呼叫時的引數傳遞方式:(呼叫函式)     傳遞方式有以下四種:    位置傳參    序列傳參    關鍵字傳參    字典關鍵字傳參(1)位置傳參:    實際引數(實參)的對應關係與形式

指標函式(Pointer Function)函式指標(Pointer to Function或Function Pointer)

一、指標函式 1、解釋:指標函式很好理解:簡單來說,就是一個返回指標的函式,本質是一個函式。如:  int fun(int x,int y);    //這是一個普通函式的宣告,返回值是一個int型別,是一個數值。  int *fun(in x,int y);  //這就是

js函式節流

前言 函式節流和去抖的出現場景,一般都伴隨著客戶端 DOM 的事件監聽。舉個例子,實現一個原生的拖拽功能(不能用 H5 Drag&Drop API),需要一路監聽 mousemove 事件,在回撥中獲取元素當前位置,然後重置 dom 的位置(樣式改變)。如果我們不加

面試之函式節流函式

從場景說起 滑動到底部繼續載入,是移動端很常見的一種場景。 通常來說,我們會在對可滑動區域(一般是window)的scroll事件做監聽,判斷距離底部還有多遠,如果距離底部較近,則發起HTTP請求,請求下一頁的資料。 很容易寫出這樣的程式碼: let page

一個函式實現函式節流函式

函式節流和函式防抖 今天在研究函式防抖和節流的過程中,發現這個方法已經把節流和防抖合二為一了,我很困惑,難道是我對節流和防抖的概念搞錯了。 函式節流:使連續執行的事件或函式,變為固定時間間隔執行。 函式防抖:使連續執行的事件或函式,在停止執行後只觸發一次。

js前端效能優化之函式節流函式

前言:針對一些會頻繁觸發的事件如scroll、resize,如果正常繫結事件處理函式的話,有可能在很短的時間內多次連續觸發事件,十分影響效能 節流: 節流:使得一定時間內只觸發一次函式。 它和防抖動最大的區別就是,節流函式不管事件觸發有多頻繁,都會保證在規定時間內一定會執行一次真正的事件處理函式