js中的防抖和节流

防抖(debounce):一段时间之后才执行某个函数
节流(throttle):一段时间之内执行某个函数

防抖(debounce): 主要是利用计时器实现;为了不污染全局变量,利用闭包,共享一个计时器变量,返回一个新的函数

myPlugin.debounce = function (callback, time) {
    var timer;
    return function () {
        clearTimeout(timer);//清除之前的计时
        timer = setTimeout(function () {
            callback();
        }, time);
    }
}

完善一下如果要传入参数的情况

myPlugin.debounce = function (callback, time) {
    var timer;
    return function () {
        clearTimeout(timer);//清除之前的计时
        var args = arguments; //利用闭包保存参数数组
        timer = setTimeout(function () {
            callback.apply(null, args);
        }, time);
    }
}

如何使用

   <script src="debounce的js路径"></script>
    <script>
        var handle = myPlugin.debounce(function(width) {
            console.log(width);
        }, 1000);
        window.onresize = function() {
            handle(document.documentElement.clientWidth);
        }
    </script>

节流(throttle): 节流有两种做法,一种是利用计时器,等某段时候之后才执行并且在在段时间内不回重新计时;另外一种是利用时间戳,该立即执行,下一次执行需要等待

第一种方法

myPlugin.throttle = function (callback, time) {
    var timer;
    return function () {
        // 如果当前有计时,直接renturn
        if (timer) {
            return;
        }
        var args = arguments; //利用闭包保存参数数组
        timer = setTimeout(function () {
            callback.apply(null, args);
            timer = null; //函数执行完要立马清空计时器,否则将无法进行下一次执行
        }, time);
    }
}

第二种方法

myPlugin.throttle = function (callback, time) {
    var t;
    return function () {
        if (!t || Date.now() - t >= time) { //之前没有计时 或 距离上次执行的时间已超过规定的值
            callback.apply(null, arguments);
            t = Date.now(); //得到的当前时间戳
        }
    }
}

所以我们可以统一一下

myPlugin.throttle = function (callback, time, immediately) {
    if (immediately === undefined) {
        immediately = true;
    }
    if (immediately) {
        var t;
        return function () {
            if (immediately) {
                if (!t || Date.now() - t >= time) { //之前没有计时 或 距离上次执行的时间已超过规定的值
                    callback.apply(null, arguments);
                    t = Date.now(); //得到的当前时间戳
                }
            }
        }
    }
    else {
        var timer;
        return function () {
            // 如果当前有计时,直接renturn
            if (timer) {
                return;
            }
            var args = arguments; //利用闭包保存参数数组
            timer = setTimeout(function () {
                callback.apply(null, args);
                timer = null; //函数执行完要立马清空计时器,否则将无法进行下一次执行
            }, time);
        }
    }
}

如何使用

    <script>
        function test() {
            console.log("a");
        }
        var handle = myPlugin.throttle(test, 1000, false);
        window.onresize = function(){
            handle();
        }
    </script>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容