函数防抖与函数节流

函数防抖与函数节流

大家好,又见面了,我是你们的朋友全栈君。

前言

有一些浏览器事件我们不希望它很频繁的触发,如调整窗口大小(onresize)、监听滚动条滚动(onscroll),如果这些监听事件需要调用接口的话一秒内可能会调用上百次,这样坑定是有问题的。

函数防抖(debounce)

如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。

function debounce(fn,wait){
    var timer = null;
    return function(){
        clearTimeout(timer)
        timer = setTimeout(()=>{
            fn()
        },wait)
    }
}

function log(){
    console.log(1)
}

window.addEventListener('scroll', debounce(log, 1000));

函数节流(throttle)

保证如果电梯第一个人进来后,10秒后准时运送一次,这个时间从第一个人上电梯开始计时,不等待,如果没有人,则不运行。
仔细想想,上面的防抖方式还是有一定的缺点。如果页面很长,我们一直在滚动页面,那log方法就一直不会被执行。所以我们可以升级一下上述的防抖方法。

function throttle(fn,wait,time){
    var previous = null; //记录上一次运行的时间
    var timer = null;

    return function(){
        var now = +new Date();

        if(!previous) previous = now;
        //当上一次执行的时间与当前的时间差大于设置的执行间隔时长的话,就主动执行一次
        if(now - previous > time){
            clearTimeout(timer);
            fn();
            previous = now;// 执行函数后,马上记录当前时间
        }else{
            clearTimeout(timer);
            timer = setTimeout(function(){
                fn();
            },wait);
        }
    }
}
function log(){
    console.log(1)
}

window.addEventListener('scroll', throttle(log, 1000, 2000));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107480.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月3日 上午6:00
下一篇 2022年4月3日 上午6:00


相关推荐

  • Java 图形界面开发–图文并茂建立学生管理系统

    Java 图形界面开发–图文并茂建立学生管理系统(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/50932501冷血之心的博客)图形用户界面(GraphicsUserInterface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~…

    2022年6月21日
    30
  • 向量空间、内积空间、欧式空间以及希尔伯特空间的关系

    向量空间、内积空间、欧式空间以及希尔伯特空间的关系在数学中有许多空间表示 比如向量空间 内积空间 欧式空间以及希尔伯特空间等 1 距离的定义具体的距离 实际上距离除了我们经常用到的直线距离外 还有向量距离 函数距离 曲面距离 折线距离等等 这些具体的距离与距离之间的关系类似于苹果 香蕉等与水果的关系 前面是具体的事物 后面是抽象的概念 距离就是一个抽象的概念 其定义为 设 X 是任一非空集 对 X 中任意两点 x y 有一实数 d

    2026年3月26日
    1
  • iOS Dev (59) 高度自适应的UITextView

    iOS Dev (59) 高度自适应的UITextView

    2022年1月18日
    43
  • Redis 雪崩和击穿

    Redis 雪崩和击穿缓存雪崩缓存雪崩是指在同一时间段大量的缓存 key 同时失效或者 Redis 服务宕机 导致大量请求到达数据库 带来巨大压力 解决方案 给不同的 key 的 TTL 添加随机值利用 Redis 集群提高服务的可用性给缓存业务添加将降级限流策略给业务添加多级缓存缓存击穿缓存击穿问题也叫热点 key 问题 就是一个被高并发并且缓存重建业务较复杂的 key 突然失效了 无数的请求访问会瞬间给数据库带来巨大的冲击 例如一个人查询数据库重建缓存数据 在缓存数据还没有写入数据库的时候其它的人也对进行重复

    2026年3月18日
    2
  • linux下解压rar文件的方法

    linux下解压rar文件的方法
      wgetlinux-3.8.0.tar.gz”>http://www.rarlab.com/rar_CN/rarlinux-3.8.0.tar.gz
      tarxzvfrarlinux-3.8.0.tar.gz
      cdrar
      makeinstall
      rarxfile.rar
      注意:rar目录中的rar文件就是可执行文件,如果没有makeinstall的权限,可以将rar放到PATH环境变量指定的目录中,直接运行r

    2022年7月11日
    18
  • 蒙特卡洛方法学习(一)[通俗易懂]

    蒙特卡洛方法学习(一)[通俗易懂]转载:http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html蒙特卡罗方法是一种计算方法。原理是通过大量随机样本,去了解一个系统,

    2022年8月6日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号