防抖方法&&节流函数源码

/**
 *
 * @param fn {Function}   实际要执行的函数
 * @param delay {Number}  延迟时间,也就是阈值,单位是毫秒(ms)
 *
 * @return {Function}     返回一个“去弹跳”了的函数
 */
function debounce(fn, delay = 500) {
    // 定时器,用来 setTimeout
    let timer = null;
    // 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 fn 函数
    return function () {
        // 保存函数调用时的上下文和参数,传递给 fn
        const context = this;
        const args = arguments;

        // 每次这个返回的函数被调用,就清除定时器,以保证不执行 fn
        clearTimeout(timer);

        // 当返回的函数被最后一次调用后(也就是用户停止了某个连续的操作),
        // 再过 delay 毫秒就执行 fn
        timer = setTimeout(function () {
            fn.apply(context, args);
        }, delay);
    };
}

export default debounce;
/**
 * 节流函数
 * @param method 事件触发的操作
 * @param mustRunDelay 间隔多少毫秒需要触发一次事件
 */
function throttle(fn, mustRunDelay) {
    let timer,
        args = arguments,
        start;
    return function loop() {
        let self = this;
        let now = Date.now();//时间戳
        if(!start){//若该函数是第一次调用,则直接设置start,即开始时间,为now,即此刻的时间
            start = now;
        }
        if(timer){ 
            clearTimeout(timer);
        }
        if(now - start >= mustRunDelay){
            fn.apply(self, args);
            start = now;
        }else {
            timer = setTimeout(function () { //
                loop.apply(self, args);
            }, 50);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值