【js手撕经典】防抖节流

防抖

防抖是指,短时间频繁触发fn,只执行最后一次,可以有效提高性能,减少服务器压力
原理:函数在n秒后再执行,如果n秒内被触发,重新计时,保证最后一次触发事件n秒后才执行。

/*
* @param {Function} callback 回调函数
* @param {Number} delay 回调函数在delay ms 后执行
* @param {Boolean} immediate 是否立即执行回调
**/
function debounce(callback,delay=300,immediate=true){
	let time = null;
	//返回一个闭包
	return (...args)=>{
		//存在定时器则清空,重新计时
		if(timer){
			clearInterval(timer)
			timer = null;
		}
		//若不立即执行
		if(!immediate){
			timer = setTimeout(()=>{
				callback.apply(this,args)
			},delay)
		}else{
			//立即执行
			//timer为空则代表此时不在delay中,可以立即执行
			let falg = !timer
			flag && callback.apply(this,args)
			timer = setTimeout(()=>{
				timer = null
			},delay)
		}
	}
}

节流

函数在一段时间内只会执行一次,如果多次触发,那么忽略执行

时间戳写法:

/*
* @param {Function} callback 执行函数
* @param {Number} delay 
*/
function throttle(callback,delay=3*1000){
	//上一次执行的时间
	let start = new Date().getTime()
	return (...args)=>{
		//这一次触发的事件
		const now = new Date().getTime();
		//如果相邻两次触发事件超过设置的delay,说明已经过了限制事件,可以执行函数。
		if(now - start >= delay){
			//更新start,方便下次对比
			start = now
			//执行函数
			return callback.apply(this,args)
		}
	}
}

定时器写法:

/*
* @param {Function} callback 执行函数
* @param {Number} delay 
*/
function throttle(callback,delay = 3*1000){
	let timer = null;
	let isThrottle = false;
	return (...args)=>{
		if(!isThrottle)=>{
			fn.apply(this,args);
			isThrottle = true;
			timer = setTimeout(()=>{
				isThrottle = false;
				timer = null;
			},delay)
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值