实用版截流和防抖

467 阅读1分钟

最近看了些截流和防抖的文章,感觉有些写的有点扯了,其实很简单的事情,手撕一下最常用的截流和防抖:

/**
 * 截流函数
 * @param fn
 * @param wait
 */
function throttle (fn: Function, wait: number = 800) {
    let startTime = 0;
    return function () {
        let now = Date.now();
        let resTime = now - startTime;
        if (resTime >= wait) {
            fn.apply(this, arguments);
            startTime = now;
        }
    };
}

/**
 * 防抖函数
 * @param fn
 * @param wait
 */
function debounce (fn: Function, wait: number = 800) {
    let timer: any;
    return function () {
        let args = arguments;
        clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(this, args);
        }, wait);
    };
}

为了在vue中使用方便,顺便来个装饰器:

/**
 * throttle 装饰器
 * @param wait
 */
function throttleDecorate (wait: number = 800) {
    return (target, name, descriptor) => {
        descriptor.value = throttle(descriptor.value, wait);
        return descriptor;
    };
}

大功告成,至于lodash的第三个参数,先触发式和后触发式,无非就是多层if判断而已,上面是我认为能在项目中比较实用的,不喜勿喷。