实现防抖函数

151 阅读1分钟
      //实现防抖函数
    //   防抖函数原理,在事件被触发n秒后在执行回调,如果在这个n秒内又被触发,则重新计时。

    // 适用场景:
    //     按钮提交场景:防止多次提交按钮,只执行最后提交的一次
    //     服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词功能类似

    //防抖函数
    const debounce  = (fn , delay) => {
        let timer = null;
        return (...args) => {
            clearTimeout(timer);
            timer = setTimeout(() => {
                fn.apply(this,args);
            },delay)
        }
    }

版本2

非立即执行版

function debounce(func, wait) {
    let timeout;
    return function () {
        let context = this;
        let args = arguments;
        
        if(timeout) clearTimeout(timeout);
        
        timeout = setTimeout(() => {
            func.apply(context, args)
        })
    }
}


调用
    let num = 1;
    let content = document.getElementById('content');

    function count() {
        content.innerHTML = num++;
    };
    正常调用
    content.onmousemove = count;
    防抖调用
    content.onmousemove = debounce(count,1000);

版本3

立即执行版

function debounce(func,wait) {
    let timeout;
    return function() {
        let context = this;
        let args = arguments;
        
        if(timeout) clearTimeout(timeout);
        
        let callNow = !timeout;
        timeout = setTimeout(() => {
            timeout = null;
        },wait)
        
        if(callNow) func.apply(context, args)
    }
}

版本4 包含立即执行和非立即执行的防抖

/**
 * @desc 函数防抖
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param immediate true 表立即执行,false 表非立即执行
 */
function debounce(func,wait,immediate) {
    let timeout;

    return function () {
        let context = this;
        let args = arguments;

        if (timeout) clearTimeout(timeout);
        if (immediate) {
            var callNow = !timeout;
            timeout = setTimeout(() => {
                timeout = null;
            }, wait)
            if (callNow) func.apply(context, args)
        }
        else {
            timeout = setTimeout(function(){
                func.apply(context, args)
            }, wait);
        }
    }
}

扫码加群