JS - 手写节流、防抖

本文介绍了JavaScript中的节流和防抖两种技术,包括它们的解释、手写实现以及计时器和Date.now()时间戳的两种实现方式。重点讲述了如何通过定时器和闭包来限制函数触发频率,以及防抖与节流的区别。
摘要由CSDN通过智能技术生成

目录

节流

解释

手写实现

全部计时器实现

Date.now() 时间戳实现

混合

防抖

解释

手写实现


节流

解释

        节流(throttle)是指让某一个函数的触发次数在一定时间内限定在一定范围内,最常的情况是一定时间内只触发最初的一次。常用在scroll监听,resize监听,drag监听,某个只提交第一下点击事件的按钮上等。

  • 需要明确:因为是函数节流,出现的地方是在调用函数作为参数,而节流函数必然需要所返回一个函数作为那个地方的参数
  • 利用一个定时器,按照以下思路进行设计:执行→定时→在定时内又执行,不触发→在定时外执行,触发,重新定时。需要定时器不被回收防止点一下就创建个新的:闭包

手写实现

全部计时器实现

/**
 * 手写函数节流(计时器)
 * @param {Function} fn 被节流的函数
 * @param {Number} delayTime 节流延迟时间 
 * @param {Boolean} isImmediate 是否立即触发执行
 * @returns 节流后的函数
 */
function throttle(fn, delayTime = 1000, isImmediate = false){
    let timer = null;
    let flag = true;
    return function(){
        let content = this;
        let args = arguments;
        
        // 不立即执行的情况
        if (!isImmediate) {
            if (timer) {
                return;
            }
            timer = setTimeout(() => {
                fn.apply(content, args);
                timer = null;
            }, delayTime);
        } 
        // 立即执行
        else {
            if (flag) {
                if (timer) {
                    return;
                }
                fn.apply(content, args);
                flag = false;
                timer = setTimeout(() => {
                    timer = null;
                    flag = true;
                }, delayTime);
            }
        }
    }
}

Date.now() 时间戳实现

/**
 * 手写函数节流(时间戳),会立即执行
 * @param {Function} fn 被节流的函数
 * @param {Number} delayTime 节流延迟时间
 * @returns 节流后的函数
 */
function throttle_2(fn, delayTime = 1000) {
    let curTime = null;
    return function() {
        let content = this;
        let args = arguments;
        if(!curTime || Date.now() - curTime >= delayTime) {
            fn.apply(content, args);
            curTime = Date.now();
        }
    }
}

混合

        可以选择不立即执行则使用计时器实现,立即执行用  Date.now()  实现。


防抖

解释

        防抖(debounce)和节流的区别就在于节流是规律触发,防抖是只保留最后一次触发把前面触发的全覆盖掉来实现。

  • 需要明确:因为是函数防抖,出现的地方是在调用函数作为参数,而防抖函数必然需要所返回一个函数作为那个地方的参数
  • 同节流,需要计时器闭包。不同的是节流是直接  return  ,不执行对应函数,而防抖是通过  clearTimeout(timer)  来直接清掉计时器从而覆盖。

手写实现

/**
 * 手写函数防抖
 * @param {Function} fn 被防抖的函数
 * @param {Number} delayTime 防抖延迟时间 
 * @param {Boolean} isImmediate 是否立即触发执行
 * @returns 防抖后的函数
 */
function debounce(fn, delayTime = 1000, isImmediate = false) {
    let timer = null;
    let flag = true;
    return function() {
        const content = this;
        const args = arguments;

        // 不立即执行的情况
        if (!isImmediate) {
            if (timer) {
                clearTimeout(timer);
            }
            timer = setTimeout(() => {
                fn.apply(content, args);
                timer = null;
            }, delayTime)
        } 
        // 立即执行
        else {
            if (flag) {
                if (timer) {
                    clearTimeout(timer);
                }
                fn.apply(content, args);
                flag = false;
                timer = setTimeout(() => {
                    timer = null;
                    flag = true;
                }, delayTime);
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值