JS基础---函数防抖和节流

本文介绍了函数防抖(debounce)和节流(throttle)的概念及其实现方法。防抖是指在一段时间内触发一个函数,只执行一次,并在该段时间内重新触发事件时重新计时。节流则是在一段时间内,函数只执行一次,通过定时器或时间戳来实现。

函数防抖和节流

防抖 debounce

概念

在一段时间内,触发一个函数,只执行一次。并且在该段时间内,再次触发事件时,重新计时一段时间。

具体的实现都是借用setTimeout()函数,分为立即执行和非立即执行两种。一般根据业务具体需求决定,可以在封装的debounce()函数中加入是否立即执行。
具体代码如下:

function debounce_test(func, wait, now) {  //now判断是否立即执行
		let timeout;
		return function () {
			let context = this;            //保存this 和函数参数,确保this指向不变和e函数的执行
			let args = arguments;

			if (!now) {   //非立即执行版本
				if (timeout) clearTimeout(timeout)  //timeout为ture说明有计时正在计时,此时应该重新计时。
				//实现方法为清空计时器,新设一个计时器并把id赋值给timeout

				timeout = setTimeout(() => {
					func.apply(context, args);
				}, wait)
				//若正常,在计时结束后调用函数。实现wait时间后调用函数,且重复调用时重新计时
			}
			else {
			//即时版本类似,但会根据是否存在计时器来调用函数,计时器的作用是将计时器在计时完成后清零。
			//实现立即执行,且在wait时间内再次调用不再执行函数。
				let doNow= !timeout;
				if (timeout) clearTimeout(timeout)

				timeout = setTimeout(()=>{
					timeout = null;
				},wait)
				if (doNow) {
					func.apply(context,args)
				}
			}
		}

	}

节流(throttle)

概念

一段时间内,函数只执行一次。有两种实现方式,时间戳和定时器实现。
大多使用结合版本或根据项目需要进行选择


```javascript
//定时器版本
function throttle(func, wait) {
		let timeout;
		return function () {
			let context = this;
			let args = arguments;
			if (!timeout) {
				timeout = setTimeout(() => {
					timeout = null;
					func.apply(context, args)
				}, wait)
			}
		}
	}
//时间戳版本
function throttle_data(func, wait) {
		let previous = 0;
		return function () {
			let now = Date.now();
			let context = this;
			let args = arguments;
			if (now - previous > wait) {
				func.apply(context, args);
				previous = now;
			}
		}


	}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值