函数防抖与节流

函数防抖与节流

Posted by nolan on October 11, 2019

防抖

在事件被触发 n 秒后再执行回调,如果这 n 秒内又被触发,则重新计时。

  • 应用
    • 搜索框输入联想,用防抖来节约请求资源;
    • 在监听滚动事件时,加上防抖来判断滚动停止后的状态;
const debounce = (fn, delay) => {
    let timeoutId = null;
    return (args) => {
        if(!!timeoutId){
            clearTimeout(timeoutId)
        }
        timeoutId = setTimeout(() => {
            fn(args)
        }, delay);
    }
}

节流

在一个单位时间内,只触发一次函数,如果这个单位时间内触发了多次,则只有一次生效。

  • 应用
    • 鼠标不断点击,单位时间内只触发一次(比如游戏的射击速度,按住鼠标射击,也只是在单位时间内射出一次)
    function throttle(fn, interval = 300) {
        let canRun = true;
        return function () {
            if (!canRun) return;
            canRun = false;
            setTimeout(() => {
                fn.apply(this, arguments);
                canRun = true;
            }, interval);
        };
    }