函数节流和函数防抖

写在前面

    在前端开发中,我们知道对于DOM的频繁操作是非常消耗资源的,尤其是对于浏览器的onresize,onscroll事件进行响应去操作DOM元素的时候,有时候会看到浏览器卡顿,用户体验非常不好。但是我们又要监听浏览器的onresize,onscroll事件,这时候函数节流(throttle)和函数防抖(debounce)就发挥作用了。

函数防抖原理

    对于连续触发的事件,我们通过设置一个定时器,让其在过了特定时间t1后触发,如果在t1时间内再次触发了该事件,则清除上一次计时器,重新计时,等待新计时时间的到来。

函数防抖的实现

    下面一个例子,通过函数防抖实现document.body的缩放,在缩放过程中不会触发自定义的函数,只有当停止缩放的时候才会执行函数:

        var debounce= {
			timeId:null,
			zoomBody: function(){
                            //逻辑代码...
                            console.log(99999);
			},
			zoomHandle: function(timeInternal){
				clearTimeout(this.timeId);
				this.timeId = setTimeout(this.zoomBody,timeInternal);
			}
		}
		document.body.onresize = function(){
			debounce.zoomHandle(500);
		}

以上代码只有在停止缩放时才会触发自定义的throttle.zoomBody函数。有时候这种方式并不能满足需求,比如用户在拖拽浏览器窗口时,去动态响应某个控件的宽度/高度,而不是等到停止拖动时才去自适应窗口。此时我们可以使用函数节流的功能。

函数节流原理

    函数节流是在函数防抖的基础上,每隔固定的时间,不管定时器触发没触发,都会执行一遍自定义函数。

函数节流的实现

        var throttle = {
			timeId:null,
			startTime: new Date(),
			zoomBody: function(){
                            //逻辑代码...                            
                             console.log(99999);
			},
			zoomHandle: function(timeInternal,maxInternal){
				clearTimeout(this.timeId);
				var cur = new Date();
				if(cur - this.startTime > maxInternal){
					this.zoomBody();
					this.startTime = cur;
				}else{
					this.timeId = setTimeout(this.zoomBody,timeInternal);
				}
			}
		}
		document.body.onresize = function(){
			throttle.zoomHandle(500,2000);
		}

以上代码,在缩放过程中,每隔2秒执行一次throttle.zoomBody函数,避免了等待停止缩放才执行的弊端。

总结

    函数防抖的合理应用能够帮助我们充分节省cpu,内存等资源,同时又通过一定的时延间隔去执行自定义函数,在一些频繁的DOM操作,http请求应用中有效提升用户体验。

函数节流函数防抖都是为了减少目标函数的频繁执行,特别是那些计算量较大、耗费性能较多的函数函数节流适用于大量事件按照时间均匀触发的情况,而函数防抖适用于多次事件只需要响应一次的情况。 函数节流的实现方式主要是通过设置一个定时器,在指定的时间间隔内只执行一次目标函数。当事件触发时,如果定时器已经存在,则不执行目标函数,并重新开始计时,直到定时器到期后执行目标函数。这样可以将大量事件按照时间均匀分配触发,减少频繁执行目标函数的情况。 而函数防抖的实现方式是设置一个定时器,在指定的时间间隔内只执行一次目标函数。当事件触发时,如果定时器已经存在,则清除定时器并重新开始计时,直到定时器到期后执行目标函数。这样可以避免多次事件触发时频繁执行目标函数,只在最后一次事件触发后执行目标函数。 在JavaScript中,函数节流函数防抖可以通过编写相应的函数来实现。函数节流可以通过设置一个定时器,在指定的时间间隔内执行目标函数函数防抖可以通过设置一个定时器,在指定的时间间隔内只执行一次目标函数。 总结来说,函数节流函数防抖是为了减少频繁执行目标函数而设计的技术,在不同的场景中选择合适的方式可以提升性能用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [js函数节流,js函数防抖](https://blog.youkuaiyun.com/MFWSCQ/article/details/100130519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [js中的函数防抖函数节流](https://blog.youkuaiyun.com/m0_52900946/article/details/124778757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值