JavaScript之节流与防抖

news/2024/7/24 7:01:56

个人博客原文地址

背景

我们在开发的过程中会经常使用如scroll、resize、touchmove等事件,如果正常绑定事件处理函数的话,有可能在很短的时间内多次连续触发事件,十分影响性能。
因此针对这类事件要进行节流或者防抖处理

节流

节流的意思是,在规定的时间内只会触发一次函数,如我们设置函数500ms触发一次,之后你无论你触发了多少次函数,在这个时间内也只会有一次执行效果

先来看一个例子

https://codepen.io/wclimb/pen...

我们看到使用了节流的在1000ms内只触发了一次,而没有使用节流的则频繁触发了调用的函数

接下来看看代码实现
v1 第一次不触发,不传参实现

function throttle(fn,interval){
    var timer;
    return function(){
        if(timer){
            return
        }
        timer = setTimeout(() => {
            clearTimeout(timer)
            timer = null
            fn()
        }, interval || 1000);
    }   
}

效果是实现了,但是我在尝试在执行函数里console.log(this),结果发现this指向的是window,而且还发现我们不能传递参数,下面就来改进一下

v2 第一次触发函数,接收参数

function throttle(fn,interval){
    var timer,
        isFirst = true;
    return function(){
        var args = arguments,
            that = this;
        if(isFirst){
            fn.apply(that,args)
            return isFirst = false
        }
        if(timer){
            return
        }
        timer = setTimeout(() => {
            clearTimeout(timer)
            timer = null
            fn.apply(that,args)
        }, interval || 1000);
    }   
}

防抖

防抖的意思是无论你触发多少次函数,只会触发最后一次函数。最常用的就是在表单提交的时候,用户可能会一段时间内点击很多次,这个时候可以增加防抖处理,我们只需要最后一次触发的事件

先来看一个例子

https://codepen.io/wclimb/pen...

我们看到使用了防抖的方框,无论你在里面触发了多少次函数,都只会触发最后的那一次函数,而没有使用防抖的则频繁触发了调用的函数

v1 第一次不触发函数

function debounce(fn,interval){
    var timer;
    return function(){
        var args = arguments,
            that = this;
        if(timer){
            clearTimeout(timer)
            timer = null
        }
        timer = setTimeout(() => {
            fn.apply(null,args)
        }, interval || 1000);
    }
}

上面这段代码仍然可以正常执行,但是我们并没有指定他的this

v2 第一次就触发函数

function debounce(fn,interval){
    var timer,
        isFirst  = true,
            can = false;
    return function(){
        var args = arguments,
            that = this;
        if(timer){
            clearTimeout(timer)
            timer = null
        }
        if(isFirst){
            fn.apply(that,args)
            isFirst = false
            setTimeout(() => {
                can = true
            }, interval || 1000);
        }else if(can){
            timer = setTimeout(() => {
                fn.apply(null,args)
            }, interval || 1000);
        }
    }
}

如有雷同,纯属抄我(开玩笑)

如有错误,还望指正,仅供参考

GitHub:wclimb


http://www.niftyadmin.cn/n/1894722.html

相关文章

软件开发工作总结

2019独角兽企业重金招聘Python工程师标准>>> 1、分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要&#xff1…

Handler进击之探索sendMessage的奇妙

Handler进阶之sendMessage 本文主要进一步的探索Handler,主要介绍下Handler是如何发送消息的?  用过Handler的想必对一下几个方法都不会陌生: sendMessage(Message msg);//立刻发送消息 sendMessageAtTime(Message msg, long atTime);//在某…

Linux系统dhcp服务器的启动,菜鸟必看Linux下架设DHCP服务器过程及3种测试

DHCP服务器的功能就是给子网中的主机分配IP地址的一种服务。客户端向服务器发出请求,DHCP服务器把没有在用的Ip地址分配给客户端的一个过程。?xml:namespace>下面就直接进入我们的主题:Linux下DHCP服务器的架设。我的是在虚拟机中做的,Li…

HAproxy负载均衡-ACL篇

ACL定制法则: 开放策略:拒绝所有,只开放已知 拒绝策略:允许所有,只拒绝某些 事实上实现安全策略,无非也就是以上两种方法 redirect 参考:http://cbonte.github.io/haproxy-dconv/configuration-…

一文读懂深度学习模型近年来重要进展(附梳理图)

2019独角兽企业重金招聘Python工程师标准>>> 唐杰老师学生帮忙整理的Deep Learning模型最近若干年的重要进展。有4条脉络,整理很不错。分享一下。 track1 cv/tensor 1943年出现雏形,1958年研究认知的心理学家Frank发明了感知机,当…

Android开发者指南(1) —— Android Debug Bridge(adb)

Android Debug Bridge Android调试桥接器,简称adb,是用于管理模拟器或真机状态的万能工具,采用了客户端-服务器模型,包括三个部分: * 客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命…

YCBanner轮播图

2019独角兽企业重金招聘Python工程师标准>>> YCBanner轮播图 主要引导界面滑动导航 大于1页时无限轮播 自定义指示器项目地址:https://github.com/yangchong211/YCBanner目录介绍 1.功能说明2.使用说明3.图片展示4.其他介绍1.功能说明 1.1 自定义轮播图…

java isAssignableFrom instanceof 小结 专题

一句话总结&#xff1a; isAssignableFrom()方法是从类继承的角度去判断&#xff0c;instanceof()方法是从实例继承的角度去判断。 public native boolean isAssignableFrom(Class<?> cls); //当前class是否为cls的父类;instanceof()方法是判断是否某个类的子类。 insta…