秒懂js函数【防抖】与【节流】

节流

如果给元素一个scroll事件,然后你开始滚动滚轮,假如它一秒钟执行50次,而你只想它每秒最多执行1次,这就是节流。

案例

1、不用写闭包的版本

function throttle(doc, eventName, fn, time = 1000) {
	let timer
	doc.addEventListener(eventName, function(){
		if(timer) return
		fn.call(this)
		timer = setTimeout(() => {
			clearTimeout(timer)
			timer = null
		},time)
	}) 
}

//调用
throttle(document, 'scroll', function() {
	console.log(this)
})

2、写闭包的版本

//传入两个值,一个是要执行的方法,一个是执行周期
function throttle(fn,time = 1000) {
	//先声明一个计时器
	let timer
	//返回一个方法(闭包)
	return function() {
		//如果计时器存在则不执行
		if(timer) return
		//如果计时器不存在则执行
		//此this到时候会变成调用这个方法的元素
		fn.call(this)
		//设置一个一定时间自身清理的计时器
		timer = setTimeout(() => {
			clearTimeout(timer)
			timer = null
		},time)
	}
}

//调用函数创建一个新的带有节流的函数
let fn = throttle(function () {
	console.log(this)
})
//设置事件
document.addEventListener('scroll',fn)

总的来说就是有计时器的时候不执行,没有计时器后就执行并创建一个新的会自杀的计时器。

防抖

给搜素框一个keyup事件,onkeyup就直接去搜索,现在想让用户输入完成后再进行搜索,也就是在用户频繁输入的时候不执行keyup事件,这就是防抖

案例

1、不用写闭包的版本

function debounce(doc, eventName, fn, time = 1000) {
	let timer
	doc.addEventListener(eventName,function () {
		//如果计时器存在,则删掉
		if(timer) clearTimeout(timer)
		//每一次都重新创建计时器
		timer = setTimeout(() => {
			fn.call(this)
		}, time)
	})
}
//调用
debounce(document,'scroll',function() {
	console.log(this)
})

2、写闭包的版本

function debounce(fn, time = 1000) {
	let timer
	return function() {
		if(timer) clearTimeout(timer)
		timer = setTimeout(() => {
			fn.call(this)
		}, time)
	}
}

//调用
const fn = debounce(function() {
	console.log(this)
})
document.addEventListener('scroll',fn)

防抖就是一直刷新带过一段时间后执行的计时器,如果用户手停了,就执行。不然一直删除一直执行,计时器就不会执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值