JavaScript进阶(五)节流

147 阅读2分钟

这是我参与8月更文挑战的第二十六天,活动详情查看:8月更文挑战

JavaScript进阶

JavaScript进阶(二)

JavaScript进阶(三)模块化

JavaScript进阶(四)防抖

节流

都说节流节流,那节流到底是什么呢?
其实啊,简单点就是你点击一个按钮多次,他会按照一定时间间隔依次执行。本质和防抖还不⼀样,防抖动是将多次执⾏变为最后⼀次执⾏。

  • 下面我们简单看一下代码实现:
// 这个是⽤来获取当前时间戳的

function now() {
    return new Date()
}

/**
 * underscore 节流函数,函数连续调⽤时, 每隔一定时间间隔返回
 * @param {function} func:回调函数
 * @param {number} wait:时间间隔
 * @param {object} options:
 * 忽略开始函数的的调⽤,传⼊{leading: false}
 * 忽略结尾函数的调⽤,传⼊{trailing: false}
 * 两者不能共存,否则函数不能执⾏
 * @return {function} 
 */
function (func, wait, options) {
    var context, args, result;
    var timeout = null;
    // 之前的时间戳
    var previous = 0;
    if (!options) options = {};
    // 定时器回调函数
    var later = function () {
        previous = options.leading === false ? 0 : now();
        // 置空⼀是为了防⽌内存泄漏,⼆是为了下⾯的定时器判断
        timeout = null;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
    };
    return function () {
        // 获得当前时间戳
        var now = now();
        if (!previous && options.leading === false) previous = now;
        // 计算剩余时间
        var remaining = wait - (now - previous);
        context = this;
        args = arguments;
        if (remaining <= 0 || remaining > wait) {
            // 如果存在定时器就清理掉避免⼆次回调
            if (timeout) {
                clearTimeout(timeout);
                timeout = null;
            }
            previous = now;
            result = func.apply(context, args);
            if (!timeout) context = args = null;
        } else if (!timeout && options.trailing !== false) {
            // 判断是否设置了定时器和 trailing
            // 否的话重新开启⼀个定时器
            // 并且不能同时设置 leading 和 trailing
            timeout = setTimeout(later, remaining);
        }
        return result;
    };
};

好了,如上就是节流的简单实现版本了。稍微有亿点点复杂,不过多看几遍,相信就能看进去了,书读百遍其义自见嘛,相信自己。

大家,再见,我是Augus,一个爱瞎搞的软件开发工程师。 END~~~