節流 (throttle) 讓一個函數不要執行的太頻繁,減少執行過快的調用,叫節流
去抖 (debounce) 去抖就是對于一定時間段的連續的函數調用,只讓其執行一次
throttle 應用場景
debounce 應用場景
每次 resize/scroll 觸發統計事件
文本輸入的驗證(連續輸入文字后發送 AJAX 請求進行驗證,驗證一次就好)
函數去抖的實現
我們以scroll事件為例,探究如何是實現滾動一次窗口打印一個hello world 字符串。 如果不對其節流或者去抖:
window.onscroll = function () { console.log('hello world');}這樣每滾動一次,實際上會打印多個 hello world。 函數去抖背后的思路是指,某些代碼不可能在沒有間斷的情況下連續執行。創建一個定時器,在指定的時間間隔之后運行代碼。當第二次調用該函數時,它會清除前一次的定時器并設置另一個。如果前一個定時器已經執行過了,這個操作就沒有任何意義。然而,如果前一個定時器尚未執行,其實就是將其替換為一個新的定時器。目的是只有在執行函數的請求停止了一段時間之后才執行。
《高程三》給出了最簡潔最經典的去抖代碼,如下:
function debounce(method, context) { clearTimeout(method.tId); method.tId = setTimeout(function() { method.call(context); }, 1000);}function print() { console.log('hello world');}window.onscroll = function() { debounce(print);};再做一些改動
function debounce(delay, action) { var tId; return function () { var context = this; var arg = arguments; if (tId) clearTimeout(tId); tId = setTimeout(function () { action.apply(context, arg); }, delay); }}window.onscroll = debounce(1000, print);函數節流的實現
函數節流就是讓連續執行的函數,變為固定時間段間斷地執行。 大概有兩種方式實現。
其一使用時間戳來判斷是否已經到回調執行時間,記錄上次執行的時間戳,然后每次觸發事件時執行回調,回調中判斷當前時間戳距離上次執行時間戳的時間間隔是否有*s,如果是,則執行,并更新上次執行的時間戳,如此循環。
var throttle = function(delay, action) { var last = 0; return function() { var curr = new Date(); if (curr - last > delay) { action.apply(this, arguments); last = curr; } }}
|
新聞熱點
疑難解答
圖片精選