节流防抖

  1. 节流–throttle,隔一段时间触发一次
    用定时器实现节流,由于定时器的延迟性,最后可能还执行一次
 function throttle1(fn, delay) {
        let timer = null
        return function () {
          let args = arguments
          let context = this
          if (!timer) {
            timer = setTimeout(() => {
              fn.apply(context, args)
              timer = null
            }, delay)
          }
        }
      }

时间戳节流,高频操作,最后一次时间间隔小,函数不在触发

    function throttle2(fn, delay) {
        let timer = null
        let last = Date.now()
        return function () {
          let args = arguments
          let context = this
          let now = Date.now()
          if (now - last >= delay) {
            fn.apply(context, args)
            last = now
          }
        }
      }
  1. 防抖debounce,时间间隔内触发,定时器不断清除,只执行最后一次
      function debounce(fn, delay) {
        let timer = null
        return function () {
          let args = arguments
          let context = this
          if (timer) {
            clearTimeout(timer)
          }
          timer = setTimeout(() => {
            fn.apply(context, args)
          }, delay)
        }
      }
  1. 由于防抖只触发最后一次,中间没有响应,看起来像是页面卡死了,所以用节流优化下,打造一个有底线的debounce:delay时间内,还是不断创建新的定时器清除旧定时器,超出delay时间后,必须给一个响应
  function betterDebounce(fn, delay) {
        let timer = null,
          last = 0
        return function () {
          let args = arguments
          let context = this
          let now = Date.now()
          if (now - last < delay) {
            clearTimeout(timer)
            timer = setTimeout(() => {
              fn.apply(context, args)
              last = now
            }, delay)
          } else {
            fn.apply(context, args)
            last = now
          }
        }
      }
	function fn() {
        console.log("hahahahah")
      }
      window.addEventListener("scroll", betterThrottle(fn, 1000))
### 节流防抖的概念 #### 防抖 (Debounce) 防抖是一种技术手段,其核心思想是在一定时间内只允许某件事情发生一次。如果在这段时间内再次触发,则重新计时。这种方法适用于需要延迟执行某些操作的场景,比如输入框中的实时搜索功能[^1]。 以下是防抖的一个典型实现: ```javascript function debounce(fn, wait) { let timer = null; return function(...args) { const context = this; clearTimeout(timer); // 清除之前的定时器 timer = setTimeout(() => { fn.apply(context, args); }, wait); }; } ``` 通过上述代码可以看出,在每次事件触发时都会清除前一个未完成的定时器并设置一个新的定时器,只有当最后一次触发之后等待指定时间才真正执行目标函数[^3]。 --- #### 节流 (Throttle) 节流则是指在一段时间内最多只能执行一次特定的操作。即使该时间段内多次触发同一事件,也只会按照设定频率来响应。这通常应用于像无限滚动加载这样的情况中[^2]。 下面是一个简单的节流实现例子: ```javascript function throttle(fn, limit) { let lastCall = 0; return function(...args) { const now = new Date().getTime(); if(now - lastCall >= limit){ lastCall = now; fn.apply(this, args); } }; } ``` 此版本利用当前时间和上次调用之间的时间差判断是否应该立即运行传入的方法;如果不是,则忽略此次请求直到满足条件为止[^3]。 --- ### 应用场景对比分析 | **特性/场景** | **防抖 Debounce** | **节流 Throttle** | |---------------------|----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | 输入框自动补全 | 用户停止打字后再发起查询 | 定期发送部分已键入的内容给服务器 | | 页面滚动监听 | 当用户结束滚屏动作后计算布局变化 | 每隔固定间隔检测视窗位置调整 | | 窗口尺寸改变处理 | 延迟到用户完全修改浏览器大小再更新界面 | 不断监控但减少不必要的重绘 | 以上表格总结了一些常见使用案例及其特点差异[^1][^2]. --- ### 实现细节探讨 对于更复杂的业务逻辑可能还需要考虑取消机制或者记忆最新参数等功能扩展。例如增强版`debounce`可以支持即时执行选项: ```javascript function advancedDebounce(func, delay, immediate=false){ var timeout; return function(){ var context = this, args = arguments; var later = ()=>{ timeout = null; if(!immediate){ func.apply(context,args);} }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later,delay); if(callNow)func.apply(context,args); }; }; ``` 而针对高性能需求下的`throttle`,也可以采用标志位代替时间戳来进行控制: ```javascript let isRunning = false; const throttledFunction = () => { if (!isRunning) { isRunning = true; console.log('Executing...'); setTimeout(() => { isRunning = false; }, 500); // Simulate work with a delay. } }; window.addEventListener('scroll', throttledFunction); ``` 这两种改进型方案提供了更大的灵活性以适应不同的实际项目环境要求[^3]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值