函数防抖与函数节流

函数防抖与函数节流

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

前言

有一些浏览器事件我们不希望它很频繁的触发,如调整窗口大小(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));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java实习生面试题_java实习生面试题(含答案)

    java实习生面试题_java实习生面试题(含答案)1.Java容器框架有哪些?Java容器框架中有两个名称分别为Collection和Set的接口2.list,map,set,array,它们有什么区别(推荐学习:java实习生面试题)List接口主要有三个实现类:LinkedList,ArrayList,Vector.LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还…

  • js中的闭包[通俗易懂]

    js中的闭包[通俗易懂]闭包是js的一个难点也是它的一个特色,是我们必须掌握的js高级特性,那么什么是闭包呢?它又有什么用呢?我们都知道,js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函…

  • 函数调用堆栈 涉及汇编(转)

    函数调用堆栈 涉及汇编(转)

  • 自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建

    自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建一、现在关于自抗扰控制技术方面的研究已经比较成熟了,基本上了解结构以后都可以找到历程实现,今天简单总结一采用自抗扰控制的仿真系统搭建,不必畏惧,熟悉皆可达。1.首先自抗扰控制分为TD(跟踪微分器),非线性组合,ESO扩张状态观测器。而每部分的公式推导均可在《自抗扰控制技术-估计补偿不确定因素的控制技术》这本书中找到,很推荐,如果有些不了解的也可以搜索韩老师的论文看看。2.按照一般论文流程,先介绍整体结构,框图如下:其实结构也挺少,使用习惯以后,其实很好理解。3.接下来按照每个部分简单做一个介绍。

  • Eclipse安装、使用及卸载

    Eclipse的安装、使用及卸载Eclipse安装网站下载安装包开始安装Eclipse使用开始使用Eclipse创建Java项目运行Java代码导入、导出项目Eclipse设置更新Eclipse卸载EclipseEclipse安装网站下载安装包Eclipse官网Eclipse下载点击左上方的Download进入Eclipse下载页面点击下方的Download进行下载(标黄的位置也可点击,可能安装方式不同)开始安装下载完成后,点击安装包开始安装点击EclipseIDEforj

  • Mac 安装Yarn「建议收藏」

    Mac 安装Yarn「建议收藏」前言近期学习ant-design-vue-pro,需要使用Yarn安装相关依赖包,以下说说在Mac上安装Yarn的尝试几种安装方式使用homebrew安装brewinstallyarn等待许久后,得到如下错误,尝试无数次后放弃,建议在良好的网络环境下尝试脚本安装curl-o–Lhttps://yarnpkg.com/install.sh|bash安装截图:简单快速,强烈建议尝试,尤其适用在国内网络环境下适用。总结homebrew适宜在网络环境良好的情况下使

发表回复

您的电子邮箱地址不会被公开。

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