什麼是消抖函數, 說一個本身應用的實例:
本身在作一個 項目裏, 有一個須要監聽 input 元素(oninput 、 onchange), 只要 它的value 變,就須要去 向服務器拉取數據。
不作優化的, 用戶對值進行操做時, 都向服務器端 拉去數據。
例如: 事件A: 用戶查詢的內容爲 5個字,那麼這個操做, 就會向服務器 請求 5次數據。
消抖就是定一個固定的t時間,延遲t時間後觸發請求服務器數據。
若是在t內,用戶繼續輸入了文字。 清除上一個定時器, 從新開一個延遲爲t的定時器。不然 直接觸發 請求服務器數據的操做。這樣對於 事件A 來講,選取合適的t, 最少只須要一次請求服務器數據。segmentfault
function debouce (fn, time, ctx) { var k = null function exec (args) { // 綁定 函數運行上下文(this) && 傳入函數參數 fn.apply(ctx || null, args) k = null } return function () { var args = arguments k !== null && clearTimeout(k) k = setTimeout(function () {exec(args)}, time) } } //測試函數 var test = debouce(function() {console.log(this);console.log(arguments)}, 3000, {a: 1})
什麼是節流函數, 相似與消抖函數,可是,不是僅僅有一個時間t而已, 還有一個
最大時間 maxLog. 當超過這個maxLog, 事件就必須觸發。 這個主要用於對 滾動軸事件的優化。 想一想用戶 一直操做 鼠標滾輪,不可能一直按照消抖函數那樣,一直不觸發滾動事件相應的處理邏輯吧。
實例demo服務器
var thrFn = function (fn, time, maxLog) { var timeK = null // var oTime = (new Date()).getTime() var execFn = function () { fn() oTime = (new Date()).getTime() } return function () { var nTime = (new Date()).getTime() clearTimeout(timeK) if (nTime - oTime > maxLog) { execFn() } else { timeK = setTimeout(execFn, time) } } }
我的理解,不對之處, 請你們指正。
下一文, 準備 reudx 源碼解析。。。app