javascript知识巩固------防抖(debounce)和节流(throttle)

防抖(debounce)

在这里插入图片描述

场景:

  • 监听一个输入框,文字变化后触发change事件
  • 直接用keyup事件,则会频繁触发change事件
  • 防抖:用户输入结束或者暂停时,才会触发change事件

封装防抖函数(场景跟代码不匹配哈 防抖的封装是一样的 事件不同而已)

//防抖debounce代码:
function debounce(fn,delay) {
    var timeout = null; // 创建一个标记用来存放定时器的返回值
    return function (e) {
        // 每当用户输入的时候把前一个 setTimeout clear 掉
        clearTimeout(timeout); 
        // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
        timeout = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay);
    };
}
// 处理函数
function handle() {
    console.log('防抖:', Math.random());
}
        
//滚动事件
window.addEventListener('scroll', debounce(handle,500));
节流(throttle)

在这里插入图片描述

场景:

  • 拖拽一个元素时,要随时拿到该元素被拖拽的位置
  • 直接用drag事件,则会频繁触发,很容易导致卡顿
  • 节流:无论拖拽速度多快,都会每隔100ms触发一次

封装节流函数(场景跟代码不匹配哈 节流的封装是一样的 事件不同而已)

//节流throttle代码:
function throttle(fn,delay) {
   let canRun = true; // 通过闭包保存一个标记
   return function () {
        // 在函数开头判断标记是否为true,不为true则return
       if (!canRun) return;
        // 立即设置为false
       canRun = false;
       // 将外部传入的函数的执行放在setTimeout中
       setTimeout(() => { 
       // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。
       // 当定时器没有执行的时候标记永远是false,在开头被return掉
           fn.apply(this, arguments);
           canRun = true;
       }, delay);
   };
}

function sayHi(e) {
   console.log('节流:', e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener('resize', throttle(sayHi,500));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值