防抖和节流

防抖(debounce)

防抖(debounce):当持续触发事件时,保证只执行最后一次事件处理函数

在给DOM绑定事件时,有些事件我们是无法控制触发频率的。 如鼠标移动事件onmousemove, 滚动滚动条事件onscroll,窗口大小改变事件onresize,瞬间的操作都会导致这些事件会被高频触发。 如果事件的回调函数较为复杂,就会导致响应跟不上触发,出现页面卡顿,假死现象。 在实时检查输入时,如果我们绑定onkeyup事件发请求去服务端检查,用户输入过程中,事件的触发频率也会很高,会导致大量的请求发出,响应速度会大大跟不上触发。

如何实现防抖呢?

每次想调用函数的时候,设置一个定时器让函数延迟执行。当连续触发的时候,前面每次定时器都会清除掉,都会停掉前面的定时器所以函数并不会运行,只会执行最后一次。

// 防抖

function debounce(fn) {
    let timeout = null; // 创建一个标记用来存放定时器的返回值
    return function () {
        clearTimeout(timeout); // 每当再次触发时候把前一个 setTimeout clear 掉
        timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证鼠标移动、滚动、输入字符过程没有停止的话,就不会执行 fn 函数
            fn()
        }, 500);
    };
}
function sayHi() {
    console.log('防抖成功');
}
let box = document.getElementById('box')
box.addEventListener('click', debounce(sayHi))

节流(throttle)

节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数

当用户连续操作的时候,我们设置一个定时器,一段时间后执行函数,并且执行完把标记改为true,所以在函数没有执行完之前一直是false。所以用户连续操作的时候,比如用户一秒钟连续操作了十次,但是对于我们这个代码来说,只可能每500毫秒执行一次,因为只有500ms之后flag才为true,才能开启下一个定时器。所以哪怕用户一秒钟之内连续点了十次,其实也只是能执行两次。这就符合节流的本意。

function throttle(fn) {
    let flag = true; // 通过闭包保存一个标记
    return function () {
        if (!flag) return; // 在函数开头判断标记是否为true,不为true则return,为true则执行后面的
        flag = false; // 立即设置为false,500ms内用户点击触发的会在上面return,不再往下执行
        setTimeout(() => { 
            fn()// 将外部传入的函数的执行放在setTimeout中
            // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。
            flag = true;
        }, 500);
    };
}
function sayHi(e) {
    console.log('节流');
}
window.addEventListener('resize', throttle(sayHi));

总结:防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值