JS节流和防抖

-----------------------------------------------------
为按钮绑定操作
var btns = []
for(var i = 0; i < 3; i++) {
	btns[i] = function() {console.log(i)} 
}
console.log(btns[0]()) // 3
// 闭包
var btns = []
for(var i = 0; i < 3; i++) {
   // 立刻执行 返回函数 i的值被闭包了
	btns[i] = (function(i) {return function() {console.log(i)}})(i)
}
console.log(btns[0]())  // 0
------------------------------------------------------
防抖
防止在短时间内执行函数多次
思路:在第一次触发事件时,不要立刻执行函数,而是等待一定时间,再来检测在这个一定时间内有没有再次触发,如果有,那么继续等待一定时间,如果没有,则执行函数
最终效果:短时间内大量触发事件,最终只执行一次
实现如下:
@param: fn[function] 需要防抖的函数
@param: delay[number] 期限时间 毫秒
function debounce(fn, delay) {
	let timer = null
	return function() {
		if(timer) clearTimeout(timer)
		timer = setTimeout(fn, delay)	
	}
}
测试
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<button type="button" id="btn">防抖</button>
		<script type="text/javascript">
			function debounce(fn, delay) {
				let timer = null
				return function() {
					if(timer) clearTimeout(timer)
					timer = setTimeout(fn, delay)
				}
			}
			function alertMsg() {
				alert('hello')
			}
			document.getElementById('btn').onclick = debounce(alertMsg, 10000)
		</script>
	</body>
</html>

最终效果是:10秒内点击多少次 都只执行一次

------------------------------------------------------
节流
效果:短时间内大量触发同一事件,执行一次后 在指定的时间内不再执行,指定时间过后再次生效
function throttle(fn, delay) {
	let state = true
	return function() {
		if(! state) return false
		state = false
		fn()
		setTimeout(() => {
			state = true
		}, delay)
	}
}
测试
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<button type="button" id="btn">节流</button>
		<script type="text/javascript">
			// 点击节流按钮后 执行一次函数后 指定时间内不再执行
			function alertMsg() {
				alert('hello')
			}
			document.getElementById('btn').onclick = throttle(alertMsg, 10000)
			function throttle(fn, delay) {
				let state = true
				return function() {
					if(! state) return false
					state = false
					fn()
					setTimeout(() => {
						state = true
					}, delay)
				}
			}
		</script>
	</body>
</html>

-------------------------------------------------------




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值