javascript 節流函數 與 消抖 函數 解析

消抖函數:

什麼是消抖函數, 說一個本身應用的實例:
本身在作一個 項目裏, 有一個須要監聽 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

相關文章
相關標籤/搜索