当前位置: 首页 > news >正文

javaScript 防抖/节流,探索学习,对新手友好的内容

文章目录

  • 写在前面
  • 应用场景
  • 实战解析
  • 最后

写在前面

防抖:debounce, 节流 : throttle ;这俩个名词大家都不陌生,不管是学习,面试,笔试,偶尔总要提提,网上的参考文献也是大有篇章,其中有好多优秀的文章都写的很好了,大家都可以参考的来理解,我们的目的只有一个,那就是理解,并学习,从而创新。我的目的就是从保姆的角度来解释一下这俩个技术,以便大家容易理解;


应用场景

这俩个技术主要是用于web实践中对于事件执行时间的把控,如windows的input,mouse相关事件,keyup等,对于这俩个名词分别解释为:防抖(debounce):一段时间后执行一次节流(throttle):一段时间内执行一次;这样还好理解一点吧,下面我们通过一段实例来解析下俩个东西,重点以防抖为对象,节流只是控制开关有别;


实战解析

先看一段防抖代码,这是我光明正大从其他博主那复制来的

function debounce(fn, delay = 300) {
        // delay 秒后执行一次
        let timer = null; //定时器开关,利用闭包保存变量
        return function () {
            clearTimeout(timer);
            timer = setTimeout(() => {
                //this:让函数获得调用者的指向
                //arguments:函数的参数,由于此处无法断言
                //故用argument
                fn.apply(this, arguments);
            }, delay)
        }
    }

上面我尽可能的加了每句的注释,在直接看懂这个函数之前,你需要了解 闭包 ,定时器,apply函数
这里我做个简单的解释:

  1. 闭包的作用:通过一系方法,将函数内部的变量(局部变量)转化为全局变量。我们这里return 的函数就形成了闭包,并且拥有了timer变量
  2. 定时器就是延迟多少秒后执行一次,也有循环定时器和立即执行器;
  3. apply函数可以理解为替调用者传递一个作用域this指向,及参数列表,属于javascript的高阶函数,这里我推荐一个学习文章:apply函数

介绍完了以上技术,我再以我的理解叙述下这个函数的执行特征:

  1. debounce函数在调用后会返回一个带有定时器的函数
  2. 这个函数在一定时间后执行,也就是我们的delay参数
  3. 这个函数在执行时会调用传入的fn函数

为什么调用fn函数需要使用apply来改变this指向呢?
帅气的人回答:这就与我们需要防抖的场景密切相关,例如input事件,该事件会执行一个传入的函数,并且附带回调参数event; 如果不用apply,那防抖函数的作用域里就访问不到这俩个最有用的东西了。

下面看我的例子

let input = document.getElementById('input');
input.addEventListener('input',debounce(search,1000))
//防抖回调执行函数,这个函数在防抖函数执行后,根据delay执行
function search(e){
    console.log(e); //这里可以拿到e,要归功于apply的arguments参数
    console.log(this);//这里可以拿到this,要归功于apply的this参数
    this.style.padding="20px";
}
//防抖
function debounce(fn, delay = 300) {
    // delay 秒后执行一次
    let timer = null;
    return function () {
        clearTimeout(timer);
        timer = setTimeout(() => {
            //this:让函数获得调用者的指向
            //arguments:函数的参数,由于此处无法断言
            //故用argument
            fn.apply(this, arguments); 
        }, delay)
    }
}

fn.apply(this, arguments); 这里的this到底是谁的this? 这是我最大的疑问,也是发这篇文章最想说的话,谁最后一次调用的debounce This就是谁的,我们绑定的是input的事件,那input调用的回调函数,this就是input的。

再来给大家看下效果:
在这里插入图片描述
另外我把节流的代码段附上,理念相同只是在控制上有所区别,大家可以根据需求扩展函数

//节流
    function throttle(fn, delay = 300) {
        // delay 秒内执行一次
        let flag = true;
        return function () {
            if (!flag) return;
            flag = false
            setTimeout(() => {
                fn.apply(this, arguments);
                flag = true
            }, delay);
        }
    }

看到这里,如果你理解了,你将会对apply函数应用,闭包函数,有更好的理解,相关于apply函数的还有call(),bind()等高阶函数,均属于一个类型,但是它们的使用场景不同,这里不再扩展。


最后

📚 javascript专栏
☃️ 个人简介:一个喜爱技术,喜欢探索的人。
🌞 励志格言: 脚踏实地,虚心学习,相信自己的配得上所有美好。
❗如果文章还可以,记得用你可爱的小手点赞👍关注✅,我会在第一时间回关。

相关文章:

  • 【docker】dockerfile优化镜像大小
  • m基于RFID和DBSCAN聚类的InSAR室内三维定位算法的matlab仿真
  • 【面试题】 对象、原型、原型链与继承?这次我懂了!
  • python-sklearn模型通用方法的介绍
  • 入坑 Hack The Box
  • Pr 视频效果:模糊与锐化
  • 智慧城市建设及发展资料合集
  • JMeter笔记16 | 性能参数配置及测试监听
  • 三个“清洁代码”技巧将使您的开发团队效率提高 50%
  • create® 3入门教程-使用多个机器人
  • Redis实战篇一 (短信登录)
  • Java高级——Class文件及解析
  • 高效代码静态测试工具Klocwork 2022.3版本快讯
  • java毕业设计艾灸减肥管理网站Mybatis+系统+数据库+调试部署
  • 【day12】【洛谷算法题】-P5712Apples-刷题反思集[入门2分支结构]
  • 【Leetcode】101. 对称二叉树
  • 【翻译】babel对TC39装饰器草案的实现
  • C++类的相互关联
  • MaxCompute访问TableStore(OTS) 数据
  • Transformer-XL: Unleashing the Potential of Attention Models
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • yii2权限控制rbac之rule详细讲解
  • 对象引论
  • 坑!为什么View.startAnimation不起作用?
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何利用MongoDB打造TOP榜小程序
  • 手写双向链表LinkedList的几个常用功能
  • 树莓派 - 使用须知
  • 走向全栈之MongoDB的使用
  • postgresql行列转换函数
  • 组复制官方翻译九、Group Replication Technical Details
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #{}和${}的区别是什么 -- java面试
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (7)svelte 教程: Props(属性)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Java入门)学生管理系统
  • (八)Spring源码解析:Spring MVC
  • (动态规划)5. 最长回文子串 java解决
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十) 初识 Docker file
  • (十七)、Mac 安装k8s
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)认识微服务
  • (转)母版页和相对路径
  • .java 9 找不到符号_java找不到符号
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 调用海康SDK以及常见的坑解释
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net(C#)中String.Format如何使用
  • .Net程序帮助文档制作
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】