一看就懂的防抖与节流

防抖节流这两个词应该不陌生吧!防抖和节流就是为了解决不可控的高频触发和快速连续触发导致响应跟不上触发,造成页面卡顿,假死现象。

lodash_debounce_throttle已经替我们封装好了这两个方法。如果你不想引用第三方库并且想知道个所以然,那下面的文章就很适合你。

防抖(debounce)

概念

延时一段时间执行一个函数,如果在这个等待时间又触发了这个事件,那么上一个事件的延时失效,以新时间的延时为准。直到没有新的事件了,函数才可以真正的执行。

生活中的类似场景

防抖就好像我们生活中关电梯门,第一个人按了关门按钮,电梯缓缓关上,外面有人按了开门,那么上一个人按的关门请求失效,以新进来的人按关门的时间为准,直到外面没有按开门了,电梯才能真正的关上。

代码中的使用场景

input框实时搜索并发送请求;scroll事件获取滚动高度;resize事件等

代码
<html>
  <script>
    // 防抖
    function debounce(fn, delay) {
      let timer = null;
      return function() {
        let context = this;
        let args = arguments;
        clearTimeout(timer);
        timer = setTimeout(function() {
          fn.apply(context, args);
        }, delay);
      }
    }
    function foo(text) {
      console.log(`${text}`);
    }
    let handleDebounce = debounce(foo, 1000);
    window.addEventListener('resize', () => handleDebounce('trigger'));
  </script>
</html>
运行结果

在这里插入图片描述

节流(throttle)

概念

延时一段时间执行一个函数,如果在这个等待时间又触发了这个事件,那么这个新的事件无效。

生活中的类似场景

节流我们还以电梯举例。节流就好像乘坐电梯的时候我们已经把门关上了,电梯已经动起来了,这个时候又来了一个人按开门键,那不好意思只能等下一部电梯了。

代码中使用的场景

登录、提交表单、发短信等按钮避免用户点击太快,重复发送多次请求、滚动加载到底部加载更多等

代码
<html>
	<body>
			<button id="btn">测试节流</button>
	</body>
	<script>
		// 节流
		function throttle(fn, delay) {
			let timer = null;
			return function() {
				let context = this;
				let args = arguments;
				if(!timer) {
					timer = setTimeout(function() {
						fn.apply(context, args);
						timer = null;
					}, delay);
				}
			}
		}
		let handleThrottle = throttle(foo, 1000);
		document.getElementById('btn').addEventListener('click', () => handleThrottle('throttle'));
	</script>
</html>
运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值