關於節流和防抖的理解問題

引入節流和防抖

首先,節流和防抖是對計算機資源的節約問題。前端

談到節流和防抖,無外乎兩個例子,拖拽問題和表單填寫問題。bash

首先是拖拽問題服務器

前端樣式:網絡

<body style="height:100%">
    <div id="scroller" style="background-color:slategrey;height:100%;overflow-y: scroll">
        <div style="background-color:darkgray;height: 200px;width: 100%; "></div>
        <div style="background-color:floralwhite;height: 200px;width: 100%; "></div>
        <div style="background-color:gray;height: 200px;width: 100%; "></div>
        <div style="background-color:azure;height: 200px;width: 100%; "></div>
        <div style="background-color:darkgray;height: 200px;width: 100%; "></div>
        <div style="background-color:floralwhite;height: 200px;width: 100%; "></div>
        <div style="background-color:gray;height: 200px;width: 100%; "></div>
        <div style="background-color:azure;height: 200px;width: 100%; "></div>
        <div style="background-color:darkgray;height: 200px;width: 100%; "></div>
        <div style="background-color:floralwhite;height: 200px;width: 100%; "></div>
        <div style="background-color:gray;height: 200px;width: 100%; "></div>
        <div style="background-color:azure;height: 200px;width: 100%; "></div>
    </div>
</body>
複製代碼

下拉事件監聽代碼閉包

window.onload = function () {
            let throttler = throttleBetter();
            document.getElementById('scroller').onscroll = function (e) {
                console.log('scroll');
            }
        }
複製代碼

操做結果以下: ui

能夠看到拖拽致使了大量的事件觸發,若是涉及到網絡請求或者重型操做會給服務器或者客戶端帶來很大負擔。spa

同理,當須要對用戶輸入進行反應時,好比用戶註冊用戶輸入用戶名的同時須要向服務器發送請求確認是否存在該用戶,若是用戶輸入每一個字符都須要發送請求,也能夠,可是這樣浪費了服務器資源,因此咱們要採用防抖去避免。code

節流和防抖的區別

看到上面的例子,可能對節流和防抖有了一個基本的理解,他們是用來節省由於觸發頻率而致使資源浪費的一種解決方案cdn

節流的特徵是什麼:節流的特徵是限流,咱們舉個例子,你去餐館吃飯,而後菜好長時間沒上,而後你就以每分鐘一次的頻率問服務員「個人菜怎麼還沒上」,服務員煩了,對你說,「你tm最好五分鐘問一次,要否則我打爆你的狗頭」,對,這就是經過限流下降你觸發的頻率。blog

那麼防抖呢?防抖的特徵是等穩定了再說,再舉個例子,你寫論文,導師說「把大家寫完的內容發我」,你呢,每寫完一個段落就單獨發給導師了,結果可想而知,導師很生氣,說:"你是否是智障,等你全寫完了單獨發我一個最終word不行麼?",因此你就先一段一段的寫,等着論文你感受看起來能夠沒什麼要改的了,發導師一個所有內容的word,ok,這就是等穩定了再說。它一樣是下降了你的觸發頻率。

從上面的例子能夠看到,限流和防抖有如下區別

  1. 原事件請求內容,限流的請求是單一變化,而防抖的請求內容是累積變化。
  2. 原事件觸發頻率,限流是固定時間間隔連續的觸發,而防抖是非固定時間間隔觸發。
  3. 兩個解決方案也由於原事件不一樣而不一樣,限流是增長觸發間隔解決,而防抖是請求內容必定時間內不發生改變時觸發。

解決代碼

節流

節流的代碼原理能夠理解:

當觸發事件發生時,設置一個定時請求任務,當下次觸發事件發生時,檢查任務是否正在執行,若是正在執行則忽略本次觸發,若是不在執行則再次設置定時請求任務。

代碼以下:

//節流
        function throttle(interval) {
            let throttleTimer;

            return function (func) {
                if (!throttleTimer) {
                    func();
                    throttleTimer = setTimeout(() => {
                        clearTimeout(throttleTimer);
                        throttleTimer = undefined;
                    }, interval);
                }
            }

        }
複製代碼

使用示例:

let tfunc = throttle(500);
        document.getElementById('scroller').onscroll = function (e) {
            tfunc(() => scrollDownListener(e));
        }
複製代碼

防抖

防抖則能夠理解爲: 當觸發事件發生時,一樣設置一個定時請求任務,當下次觸發事件發生時,清除並更新該請求任務直到指望時間內再也不觸發才經過定時請求任務完成請求

代碼以下:

//防抖
        function debounce(delaytime) {
            let debonceTimer;

            return function (func) {
                clearTimeout(debonceTimer);
                debonceTimer = setTimeout(() => {
                    func();
                    clearTimeout(debonceTimer);
                    debonceTimer = undefined;
                }, delaytime);
            }
        }

複製代碼

使用示例:

let dfunc = debounce(500);
        document.getElementById('input').onchange = function (e) {
            tfunc(() => inputListener(e));
        }
複製代碼

上述的節流和防抖的封裝中,涉及到了閉包的問題,這個問題我下一個文章再和你們通俗易懂的分享吧

總結

節流和防抖是兩個提高用戶體驗和計算資源的有效解決方案,二者的特色和應用場景各有不一樣,但願各位能從中學到東西並應用起來,還算是很簡單的兩個知識點。

若是這篇文章內容的代碼和寫做存在問題歡迎一塊兒討論,若是有疑問也歡迎騷擾,第一次寫文章,見諒

相關文章
相關標籤/搜索