JS防抖和节流进阶版 附验证实例

这篇博客深入探讨了JavaScript中的防抖(debounce)和节流(throttle)技术,提供了升级版的实现代码。防抖函数确保在一定时间内只执行最后一次回调,而节流则限制了函数的执行频率。文章通过实际的DOM事件监听示例,如输入框按键事件和页面滚动事件,展示了防抖和节流在性能优化上的应用。同时,文章还考虑了this上下文和不同版本的节流实现,包括延时器版本和时间戳版本。
摘要由CSDN通过智能技术生成

在我年轻的时候,写了这样一篇防抖和节流的文章。

极简版JavaScript 节流和防抖

那篇文章,既没有考虑到 dom调用监听器的this指向,也没有考虑其他方法。

因此现在来一个升级版。

防抖

function debounce(callback, time) {
  let timer = null;
  return function (e) {
    // 如果timer存在,则清除定时器
    timer && clearTimeout(timer);
    // 然后重新开始计时
    timer = setTimeout(() => {
      // 这里的this是来自上级作用域的
      callback.call(this, e);
      timer = null; //重置定时器变量,不然上面的timer && clearTimeout(timer)就是无效代码了,不重置的话timer就一直有值
    }, time);
  }
}

验证


<input type="text">

 <script src="./防抖.js"></script>

 <script>

 const input = document.querySelector('input');

  

 input.onkeydown = debounce(function(e){

 console.log(e.keyCode);

 },500)

 </script>

节流

// 延时器版本
// 第一次触发需要等待设定时间才会执行
function throttle(callback, time) {
  let timer = null;
  return function (e) {
    if (!timer) {
      timer = setTimeout(() => {
        callback.call(this, e);
        timer = null;
      }, time);
    }
  }
}
// 时间戳版本
// 第一次触发就会立马执行
function throttle(callback, wait) {
  let start = 0;
  return function (e) {
    // 如果时间间隔大于需要等待的时间
    if (Date.now() - start >= wait) {
      start = Date.now();
      callback.call(this, e);
    }
  }
}

验证

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <style>
 body{
 height: 2000px;
 background: linear-gradient(#125,#eae);
 }
 </style>
</head>
<body>
 <script src="./节流.js"></script>
 <script>
 // 绑定滚动事件
 window.addEventListener('scroll',throttle(function(e){
 console.log(Date.now());
 console.log(e);
 },500));
 </script>
</body>
</html>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值