這篇文章跟大家分享了JavaScript函數節流和函數去抖的相關的知識點內容,有需要的朋友們可以學習參考下。
概念
節流(throttle) 讓一個函數不要執行的太頻繁,減少執行過快的調用,叫節流
去抖(debounce) 去抖就是對於一定時間段的連續的函數調用,只讓其執行一次
throttle 應用場景
#DOM 元素的拖曳功能實現(mousemove)
#射擊遊戲的mousedown/keydown 事件(單位時間只能發射一顆子彈)
計算滑鼠移動的距離(mousemove)
#Canvas 模擬畫板功能(mousemove
#搜尋聯想(keyup
監聽滾動事件判斷是否到頁面底部自動載入更多:給scroll 加了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; } } }
第二種方法是使用定時器,例如,當scroll事件剛觸發時,列印一個hello world ,然後設定一個1000ms的定時器,此後每次觸發scroll事件,觸發回調,如果已經存在定時器,則回呼不執行方法,知道定時器出發,handler被清除,然後重新設定定時器。
var throttle = function(delay, action) { var timeout; var later = function () { timeout = setTimeout(function(){ clearTimeout(timeout); // 解除引用 timeout = null; }, delay); }; later(); if (!timeout) { action.apply(this, arguments); later(); } }
更新方法:
function throttlePro(delay, action) { var tId; return function () { var context = this; var arg = arguments; if (tId) return; tId = setTimeout(function () { action.apply(context, arg); clearTimeout(tId); // setTimeout 返回一个整数,clearTimeout 之后,tId还是那个整数,setInterval同样如此 tId = null; }, delay); } }
以上就是本章的全部內容,更多相關教學請造訪JavaScript影片教學!
以上是JavaScript函數節流和函數去抖知識點學習的詳細內容。更多資訊請關注PHP中文網其他相關文章!