函数的防抖与节流

一、函数防抖

(一)防抖的理解

防抖就是将所有的触发都取消,在规定的时间结束过后才会执行最后一次,也就是说连续快速的触发只会执行最后一次结果。

也可以理解为游戏里的回城按钮,每点一下就会重新刷新回城进度,永远以最后一次点击为准。

例如:我们现在有一个输入框,在没有使用防抖的情况下,我们输入一个字符就会给服务器发送一次请求。

但是我们使用防抖过后,我们只会发送最后一次输入事件触发的请求。

(二)使用JS实现防抖

防抖可以使用定时器+闭包实现

关于闭包可以看这个MDN上的教程:

闭包 - JavaScript | MDN (mozilla.org)

防抖其本质就是用户每执行一次输入操作就开启一个定时器,如果用户继续输入,就把前面的定时器全部清除,永远只留下最后一个定时器。

const ipt = document.querySelector("input");
// 触发输入框输入事件
ipt.addEventListener('input', debounce(() => {
    console.log("向服务器发送一次请求,内容为" + ipt.value);
}, 1000));

// 防抖函数,接收两个参数
// 一个是事件回调函数,一个是指定最后一次触发时间
function debounce(fn, delay) {
    // 定时器,使用闭包将它缓存在内存中
    let t = null;
    return function () {
        // 如果这次输入的时候检测到已经开启了定时器,就清除上一个定时器
        if (t !== null) {
            clearTimeout(t);
        }
        // 重新开启新的定时器,该定时器永远是最后一个定时器
        t = setTimeout(() => {
            // 等到定时器结束触发事件回调函数
            fn();
        }, delay)
    }
}

(三)使用Lodash实现防抖

首先需要下载和引入lodash,下面是下载Lodash的官方网址:

Lodash 简介 | Lodash中文文档 | Lodash中文网 (lodashjs.com)

这一条讲的是防抖函数的使用:

lodash.debounce | Lodash中文文档 | Lodash中文网 (lodashjs.com)

_.debounce(回调函数, 延迟时间)

const ipt = document.querySelector("input");
ipt.addEventListener('input', _.debounce(() => {
   console.log("向服务器发送请求,请求数据为:" + ipt.value);
}));

二、函数节流

(一)节流的理解

节流就是在规定的时间间隔内不会重复触发回调,只有过了这个时间间隔后才能触发回调,使用这种方法把触发频率变为少量触发。

可以理解为我们平时输入手机号获取验证码,获取验证码过后,用户在短时间内不能再获取验证码,只有等这个时间过了才能再次发送验证码。

(二)使用JS实现节流

节流也是使用定时器+闭包来实现

其本质就是使用一个变量来记录当前状态,如果我们在触发事件的时候这个变量状态是可以触发,就开启一个定时器后变为不可触发,等待定时器结束后再把状态改为可以触发。

let num = 0;
const span = document.querySelector("span");
const button = document.querySelector("button");
// 触发点击按钮num+1事件
button.addEventListener("click", throttle(() => {
    num++;
    span.innerText = num;
}, 2000))

// 节流函数,接收两个参数
// 一个是事件回调函数,一个是指定触发事件的间隔时间
function throttle(fn, delay) {
    // 记录当前事件状态,true为可以触发,false为不可触发
    let t = true;
    return function () {
        // 如果这次事件可以触发,就执行回调函数并开启一个定时器,然后将状态变为false
        // 如果点击的时候事件不可触发,则状态一直为false
        if (t) {
            fn();
            setTimeout(() => {
                // 等到定时器结束触发事件回调函数,并重新把状态调为true
                t = true;
            }, delay)
        }
        t = false;
    }
}

(三)使用Lodash实现节流

Lodash官方文档中节流函数的使用:

lodash.throttle | Lodash中文文档 | Lodash中文网 (lodashjs.com)

_.throttle(回调函数, 时间间隔)

let num = 0;
const span = document.querySelector("span");
const button = document.querySelector("button");
button.addEventListener("click", _.throttle(() => {
    num++;
    span.innerText = num;
}, 2000))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/190583.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java学习part13Object类和常用方法

1.Object 2.常用方法 2.1clone() clone()就是深拷贝,创建一个同内容新对象。需要实现接口 2.2finalize()已废弃 类似于析构函数,在GC回收之前调用。 System.gc()强制调用gc,然后就能看到finalize()的输出 2.3equals() 对于引用类型可用。…

WIFI模块(esp-01s)获取网络时间与天气信息

目录 一、硬件连接 二、获取网络时间 1、AT指令集 2、具体操作 三、获取天气信息 1、心知天气注册 2、AT指令集 3、具体操作 4、json格式检查 一、硬件连接 WiFi模块的RX连接TTL模块的TX, WiFi模块的TX连接TTL模块的RX,电源与地接对。 插入电脑…

文心一言 VS 讯飞星火 VS chatgpt (143)-- 算法导论12.1 3题

三、用go语言,设计一个执行中序遍历的非递归算法。(提示:一种容易的方法是使用栈作为辅助数据结构;另一种较复杂但比较简洁的做法是不使用栈,但要假设能测试两个指针是否相等。) 文心一言,代码正常运行: …

基于51单片机的智能垃圾桶硬件设计

**单片机设计介绍, 基于51单片机的智能垃圾桶硬件设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能垃圾桶设计旨在通过传感器和控制电路实现智能化的垃圾桶功能。下面是一个简要的硬件设计介绍&…

HCIA-RS基础-距离矢量路由协议

前言: 动态路由协议根据寻径方式可以分为距离矢量路由协议和链路状态路由协议。本文将详细介绍距离矢量路由协议的原理,并阐述其中一个重要概念——路由环路,同时介绍如何避免路由环路的方法。通过学习本文,您将能够深入理解距离矢…

什么是CAS/CAS的应用/CAS的ABA问题

文章目录 CAS1. 什么是CAS2. CAS的应用2.1 实现原子类2.2 实现自旋锁 3. CAS的ABA问题3.1 什么是ABA问题3.2 ABA问题引来的BUG3.3 解决方案 CAS 1. 什么是CAS CAS: 全称Compare and swap, 字面意思:”比较并交换“. 操作: 设V为内存中的值, A为寄存器中的值(旧的预期值), B也…

火柴棒等式

枚举 只要在保证等式正确的基础上判断火柴棒有没有用完就可以 因为数比较小,而且我不知道最大的等式中的数是多少,索性就设置为999了 还好对效率要求不大(doge) 要不然就得自己慢慢改最大数来试了 代码如下: #in…

Android 单元测试初体验

Android 单元测试初体验 前言一、单元测试是什么?二、简单使用1.依赖2.单元测试代码简单模版及解释 总结 前言 当初在学校学安卓的时候,老师敢教学进度,翻到单元测试这一章节的时候提了两句,没有把单元测试当重点讲,只…

jQuery_09 事件的绑定与使用(on)

jQuery使用on绑定事件 jQuery可以给dom对象添加事件 在程序执行期间动态的处理事件 1. $("选择器").事件名称(事件处理函数) $("选择器") : 选择0或者多个dom对象 给他们添加事件 事件名称:就是js中事件名称去掉on的部分 比如单击…

PTA-7-53 身份证排序

题目: 输入n,然后连续输入n个身份证号。 将每个身份证的年月日抽取出来,按年-月-日格式组装,然后对组装后的年-月-日升序输出。 根据题目要求,代码实现如下: import java.util.Scanner; import java.uti…

linux之间的免密通信原来是这么的简单

linux之间的免密通信原来是这么的简单 何为免密通信,说的大白话就是,我连接你的服务器不需要密码,哈哈,就是所谓的免密通信 今天小编也不讲免密的基本原理了哈,原理的话,百度里面有好多 小编的主要目的呢是…

1.1 半加器

输入1输入2结果进位0000101001101101 半加器: 实现1位的加法 根据结果可知输入1与输入2相加结果 -> 符合 异或门进位 -> 符合 与门最终要么有结果要么有进位,不存在即有结果也有进位 异或门的实现也可以由基本的3个 “与或非” 门实现 与:& , 或:| , 非:! 用这3个…

开通橱窗还能开抖店吗?怎么开通?一篇详解!

我是电商珠珠 开通商品橱窗之后还能开抖店吗?商品橱窗和抖音小店可以同时开吗? 一部分人最初的时候,都觉得直播带货很火,所以就自己去买粉丝或是发视频积攒粉丝,等粉丝够了发现,好像和当初想的不太一样&a…

2017年五一杯数学建模A题公交车排班问题解题全过程文档及程序

2017年五一杯数学建模 A题 公交车排班问题 原题再现 随着徐州市经济的快速发展,公交车系统对于人们的出行扮演着越来越重要的角色。在公交车资源有限的情况下,合理的编排公交车的行车计划成为公交公司亟待解决的问题。以下给出公交车排班问题中的部分名…

Java实现-数据结构 2.时间和空间复杂度

.如何衡量一个算法的好坏:时间复杂度和空间复杂度 算法效率分为时间效率和空间效率,时间效率称为时间复杂度,空间效率称为空间复杂度 时间复杂度 算法的时间复杂度是一个数学函数,它描述了算法的运行时间,一个算法执…

什么是客户自助服务?综合指南献上~

《哈佛商业评论》曾报道过,81%的消费者在找客服之前会自己先去找办法解决。 如今,客户希望得到更快的响应。他们不想排队去等信息。他们想要的只是一个更快、更可靠的自助服务解决方案。作为企业,应该注意到他们的期望。企业需要做的就是通过…

2017年五一杯数学建模C题宜居城市问题值解题全过程文档及程序

2017年五一杯数学建模 C题 宜居城市问题 原题再现 城市宜居性是当前城市科学研究领域的热点议题之一,也是政府和城市居民密切关注的焦点。建设宜居城市已成为现阶段我国城市发展的重要目标,对提升城市居民生活质量、完善城市功能和提高城市运行效率具有重要意义。…

2009年iMac装64位windows7及win10

2009年iMac装64位windows7及win10 Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项 安装完Mac OS系统后,要制作Windows7安装U盘时才发现,Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项,搜索到文章:修改Boo…

C语言——深入理解指针(2)

目录 1. 数组名 2. 指针访问数组 3. 一维数组的传参(本质) 4. 冒泡排序 5. 二级指针 6. 指针数组(指针的数组) 7. 指针数组模拟二维数组 1. 数组名 在之前的代码中我们使用指针访问过数组的内容。 int arr[10] {1,2,3,4…

xxljob学习笔记01(小滴课堂)

分布式调度xxl-job源码部署和数据库建立: 在idea中打开安装包: 创建数据库: 建表: 在项目里: 在navicat里运行语句即可: 修改数据库地址和用户名,密码: 配置令牌,不然谁…