节流(Throttling )和防抖(Debouncing )

本文介绍了两种常见的事件处理优化方法:debouncing(防抖)和throttling(节流)。debouncing确保在一系列连续触发的事件之后,仅执行最后一次事件响应;而throttling则保证事件响应不会过于频繁地被调用,从而降低系统的负载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了区分这两个思想,最常用的例子就是电梯例子,我们也通过该例子来比较两个思想。当有很多人用电梯时,我们不能每来一个人,电梯都特意去送这个人一趟。这样,电梯的运行方式可以有两种优化思想

debouncing


每上一个人,从这个人开始,指定时间(比如400ms)后电梯关闭开始送人。在程序中,也就是每发生一个事件,从这个事件往后T秒,执行回调函数。
//实现函数:
	var debounce = function(func, delay) {
		var inDebounce = undefined;
		return function() {
			debugger
			var context = this,
			args = arguments;
			clearTimeout(inDebounce);
			return inDebounce = setTimeout(function() {
				return func.apply(context, args);
			}, delay);
		}
	}
<!-- 调用函数 -->
<body>
	<button >click me</button>
</body>
<script>
function aFunction(msg){
		console.log(msg);
	}
	$('button').click(debounce(function() {
		return aFunction('i am message');
	}, 400));
</script>


Throttling 


从上第一个人开始,电梯指定时间循环着执行,无论中间是否上人,都是每t秒运行一次。
//实现函数:
	var throttle = function(func, limit) {
		var inThrottle = undefined;
		return function() {
			var args = arguments,
			context = this;
			if (!inThrottle) {
				func.apply(context, args);
				inThrottle = true;
				return setTimeout(function() {
					return inThrottle = false;
				}, limit);
			}
		};
	};

<!-- 调用函数 -->
<body>
	<button >click me</button>
</body>
<script>
	function aFunction(msg){
		console.log(msg);
	}
	$('button').click(throttle(function() {
		return aFunction('i am message');
	}, 400));
</script>

### JavaScript中函数节流防抖的实现与应用场景 #### 函数节流Throttling节流是指在一段时间内只允许一个函数被执行一次,即使这个时间段内多次触发了该函数。这种机制可以有效地减少高频率事件处理器的压力。 - **概念** 节流的核心在于设定一个固定的时间间隔,在这段时间内不论触发多少次目标函数都只会执行一次[^3]。 - **使用场景** 常见的应用场景包括窗口调整大小、滚动条位置变化以及拖拽操作等连续发生的DOM事件监听器上。这些情况下如果不加以控制可能会造成浏览器卡顿或者不必要的计算资源浪费[^4]。 - **实现方法** ```javascript function throttle(func, wait) { let timeout = null; return function(...args) { if (!timeout) { timeout = setTimeout(() => { func.apply(this, args); timeout = null; }, wait); } }; } ``` 此代码定义了一个`throttle`函数来创建一个新的受控版本的目标回调函数`func`,它会在指定毫秒数(`wait`)之后才真正调用原函数,并且在这段时间里忽略所有的后续请求直至计时期满为止。 #### 函数防抖Debouncing防抖则是指当某个动作停止发生后的特定时间内再执行相应逻辑;如果在此期间又发生了新的相同类型的活动,则会重置定时器并等待下一轮静默期结束后再做处理。 - **概念** 当用户行为持续不断地重复时,比如快速点击按钮或是输入框内的文字录入过程,通过设置一定的延时参数使得最后一次交互完成之后经过这段预设好的时间间隔才会触发实际的任务流程[^1]。 - **使用场景** 对于表单验证、搜索建议等功能来说非常有用,因为它们通常不需要每次按键就立即响应,而是等到用户的输入稳定下来以后再去获取数据或更新界面显示[^2]。 - **实现方法** ```javascript function debounce(func, delay) { let timer; return (...args) => { clearTimeout(timer); // 清除之前的定时器 timer = setTimeout(() => { func.apply(null, args); }, delay); }; } ``` 上述实现了简单的防抖功能,每当接收到新事件就会取消前一次未到期的延迟任务,并启动新一轮倒计时,只有当整个过程中没有任何干扰因素存在的情况下才能最终激活关联的操作。 #### 如何选择防抖节流? 对于那些需要频繁响应但是并不依赖最新状态的情况可以选择采用节流策略,而对于必须基于最新的用户互动来进行下一步工作的场合则更适合运用防抖方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值