javascript面试-介绍防抖节流原理、区别以及应用,并用javascript进行实现

  1. 防抖
    原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。
    适用场景:
    a. 按钮提交场景:防止多次提交按钮,只执行最后提交的一次
    b. 搜索框联想场景:防止搜索发送请求,只发送最后一次输入
    简易版实现:
function debounce( func, wait ) {
	let timeout;
	return function() {
		const context = this;
		const args = arguments;
		clearTimeout(timeout)
		timeout = setTimeout(function(){
			func.apply(context, args)
		}, wait);
	}	
}
立即执行版实现
	有时希望立刻执行函数,然后等到停止触发n秒后,才可以重新触发执行
function debounce(func, wait, immediate) {
	let timeout;
	return function () {
		const context = this;
		const args = arguments;
		if(itmeout) clearTimeout(timeout);
		if(immediate){
			const callNow = !timeout
			timeout = setTimeout(function(){
				timeout = null;
			}, wait)
			if(callNow){func.apply(context, args)}
		} else {
			timeout = setTimeout(function(){
				func.apply(context.args)
			}, wait)
		}
	}
}
返回值版实现
	func函数可能会有返回值,所以需要返回函数结果,但是当immediate为false的时候,因为使用了setTimeout,我们将func.apply(context, args)的返回值赋给变量,最后再reture的时候,值将会一直是undefined,所以只在immediate为true的时候返回函数的执行结果
function debounce(func, wait, immeditate){
	let timeout, result;
	return function(){
		const context = this;
		const args = auguments;
		if(itmeout) clearTimeout(timeout);
		if(immediate){
			const callNow = !timeout
			timeout = setTimeout(function(){
				timeout = null;
			}, wait)
			if(callNow){ result = func.apply(context, args)}
		} else {
			timeout = setTimeout(function(){
				func.apply(context.args)
			}, wait)
		}
		return result;
	}
}
  1. 节流
    原理:规定在一个单位时间内,只能触发一次函数,如果这个单位时间内触发多次函数,只有一次生效。
    适用场景:
    a. 拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动
    b. 缩放场景:监控浏览器resize
    使用时间戳实现
    使用时间戳,当触发事件的时候,我们取出当前时间戳,然后减去之前 的时间戳(最开始值设为0),如果大于设置的时间周期,就执行函数,然后更新时间戳为当前的时间戳,如果小于,就不执行。
function throttle(func, wait) {
	let context, args;
	let previous = 0;
	return function() {
		let now = +new Date();
		context = this;
		args = arguments;
		if(now - previous > wait) {
			func.apply(context, args);
			previous = now;
		}
	}
}
使用定时器实现
	当触发事件的时候,我们设置一个定时器,再触发事件的时候,如果定时器存在,就不执行,直到定时器执行,然后执行函数,清空定时器,这样就可以设置下个定时器
function throttle(func, wait) {
	let timeout;
	return function() {
		const context = this;
		const args = arguments;
		if(!timeout) {
			timeout = setTimeout(function(){
				timeout = null;
				func.apply(context, args);
			}, wait)
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中可以使用定时器来实现节流防抖的效果。下面是一些基本的实现示例: 1. 节流实现: ```javascript function throttle(func, delay) { let timer = null; return function() { if (!timer) { timer = setTimeout(() => { func.apply(this, arguments); timer = null; }, delay); } }; } ``` 使用示例: ```javascript function handleScroll() { console.log('Scroll event'); } const throttledScroll = throttle(handleScroll, 200); window.addEventListener('scroll', throttledScroll); ``` 上述代码中,`throttle`函数接受一个函数和一个延迟时间作为参数,返回一个新的函数。这个新的函数在被调用时,如果定时器不存在,则设置一个定时器,并在延迟时间后执行传入的函数。如果定时器已经存在,则不执行传入的函数。 2. 防抖实现: ```javascript function debounce(func, delay) { let timer = null; return function() { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, arguments); }, delay); }; } ``` 使用示例: ```javascript function handleInput() { console.log('Input event'); } const debouncedInput = debounce(handleInput, 500); inputElement.addEventListener('input', debouncedInput); ``` 上述代码中,`debounce`函数接受一个函数和一个延迟时间作为参数,返回一个新的函数。这个新的函数在被调用时,会先清除之前的定时器,然后设置一个新的定时器,并在延迟时间后执行传入的函数。 这些是基本的节流防抖实现示例,你可以根据实际需求进行调整和扩展。希望对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值