JavaScript 防抖与节流

JavaScript 防抖与节流

前言

DOM 事件中有很多高频操作,比如 onscroll 滚动监听,input 输入值监听,获取屏幕尺寸 resize 等。在实际应用场景中还有防止按钮多次点击。那么怎么减少高频事件的执行和阻止按钮多次点击昵?最好的方案就是防抖与节流。

防抖

上一个定时器没有执行完,直接清除定时器,开启下一轮定时器。将多个操作优化为只在最后一次执行。
使用场景:用户输入。输入完成之后做一次校验即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>React App</title>
</head>
<body>
<input type="text" id="input">
</body>
<script>
    function sayHi(ages) {
        console.log(ages);
    }
   function debounce(fn,time,immediate) {
       var timer = null ;
       var context = this;
       var callNow = immediate;
       return function(...args){
          //立即执行
	      if (immediate) {
	           fn.apply(context, args);
	           callNow = false;
	       }
           //当有定时器时,先将定时器清掉
          if(timer) {clearTimeout(timer)}
          //然后开启下一轮定时器
          timer = setTimeout(()=>{
                  fn.apply(context,arg);              
              },time)
          }
   }
    var input = document.getElementById('input');
    input.addEventListener('input', debounce(sayHi,1000,'防抖')); // 防抖
</script>
</html>

节流

上一个定时器没有执行完,直接返回,等待执行完成之后,再开启下一轮定时器。
使用场景: 滚动条事件 或者 resize 事件,通常每隔 100~500 ms执行一次即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>React App</title>
</head>
<body>
<input type="text" id="input">
</body>
<script>
    function sayHi(ages) {
        console.log(ages);
    }
   function throttle(fn,time,immediate) {
       var timer = null;
       var context = this;
       var callNow = immediate;
       return function(...arg){
	       if (callNow) {
	            fn.apply(context, args)
	            callNow = false
	        }
          //只有当上一轮定时器走完才开启下一轮
          if(!timer){
              timer = setTimeout(()=>{
                  fn.apply(context,arg);
                  clearTimeout(timer);
                  timer = null;
              },time)
          }
       }
   }
    var input = document.getElementById('input');
    input.addEventListener('input', throttle(sayHi,500,'节流')); // 节流
</script>
</html>

区别

不管是防抖还是节流,其根本原理都是通过定时器来阻止高频事件。区别在于:

  1. 防抖只是为了防止多个定时器同时执行造成的抖动或者卡顿。所以在没有开启下一轮定时器时,都需要先将已存在的定时器清掉。这样就不会同时存在多个定时器。
  2. 节流是在防抖的基础上对定时器时间有更高的要求。必须等到上一轮定时器走完才可开启下一轮定时器。
  3. 假设定时器为 3s,防抖是走到1s,2s的时候把定时器清除,继续开启下一轮定时器,继续走1s,2s,,。节流是走到 1s,2s 的时候直接返回。非要走完1s,2s,3s 方可开启下一轮定时器。
  4. 防抖:1,2 || 1,2,3 || 1 || 1,2,3;
    节流:1,2,3 || 1,2,3 || 1,2,3 || 1,2,3。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaScript中的是为了控制函数的执行频率,以提高性能和优化用户体验。 (debounce)是指在一定的时间间隔内,只执行最后一次操作。引用提供了一个自定义的函数示例。该函数接受两个参数:待执行的函数和延迟时间。在函数调用时,如果在延迟时间内再次触发了函数调用,则会清除之前的定时器,重新设置一个新的定时器,以延迟函数的执行。 (throttle)是指在一定的时间间隔内,限制函数的执行频率。引用和提供了两个不同的函数示例。这些函数都可以指定一个时间间隔,只有在这个时间间隔内函数没有被执行过才能继续执行。其中,引用实现了一个基于定时器的函数,而引用则是一个基础版的函数,使用了时间戳来判断是否达到执行条件。 需要注意的是,可以根据具体的需求和场景来选择使用,以达到更好的效果。适用于需要等待用户停止操作后才执行的场景,而适用于需要限制函数执行频率的场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaScript 的实现](https://blog.csdn.net/weixin_43853746/article/details/122654312)[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* [【JavaScript(debounce)、(throttling)](https://blog.csdn.net/qq_46658751/article/details/123386755)[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 ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值