首页 > 其他分享 >JS中的函数防抖

JS中的函数防抖

时间:2023-04-12 17:45:58浏览次数:32  
标签:function 触发 防抖 函数 timer JS 执行

一、什么是函数防抖

概念:函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间。

举个栗子,坐电梯的时候,如果电梯检测到有人进来(触发事件),就会多等待 10 秒,此时如果又有人进来(10秒之内重复触发事件),那么电梯就会再多等待 10 秒。在上述例子中,电梯在检测到有人进入 10 秒钟之后,才会关闭电梯门开始运行,因此,“函数防抖”的关键在于,在 一个事件 发生 一定时间 之后,才执行 特定动作

二、为什么需要函数防抖

  前端开发过程中,有一些事件,常见的例如,onresizescrollmousemove ,mousehover 等,会被频繁触发(短时间内多次触发),不做限制的话,有可能一秒之内执行几十次、几百次,如果在这些函数内部执行了其他函数,尤其是执行了操作 DOM 的函数(浏览器操作 DOM 是很耗费性能的),那不仅会浪费计算机资源,还会降低程序运行速度,甚至造成浏览器卡死、崩溃。这种问题显然是致命的。

除此之外,短时间内重复的 ajax 调用不仅会造成数据关系的混乱,还会造成网络拥塞,增加服务器压力,显然这个问题也是需要解决的。

三、函数防抖如何解决上述问题

根据上面对问题的分析,细细思索,可以想到如下解决方案。

函数防抖的要点,是需要一个 setTimeout 来辅助实现,延迟运行需要执行的代码。如果方法多次触发,则把上次记录的延迟执行代码用 clearTimeout 清掉,重新开始计时。若计时期间事件没有被重新触发,等延迟时间计时完毕,则执行目标代码。

四、函数防抖的代码实现

根据以上分析,我们对 “函数防抖” 来进行简单的代码实现,如下:

function debounce(fn,wait){
    var timer = null;
    return function(){
        if(timer !== null){
            clearTimeout(timer);
        }
        timer = setTimeout(fn,wait);
    }
}
    
function handle(){
    console.log(Math.random());
}
    
window.addEventListener("resize",debounce(handle,1000));

  

 
以上代码本人亲测有效,小伙伴们可放心食用(注意,函数触发方式为 “resize”,改变窗口大小,观察浏览器控制台的变化)。

五、函数节流的使用场景

函数防抖一般用在什么情况之下呢?一般用在,连续的事件只需触发一次回调的场合。具体有:

  1. 搜索框搜索输入。只需用户最后一次输入完,再发送请求;
  2. 用户名、手机号、邮箱输入验证;
  3. 浏览器窗口大小改变后,只需窗口调整完后,再执行 resize 事件中的代码,防止重复渲染。

目前遇到过的用处就是这些,理解了原理与实现思路,小伙伴可以把它运用在任何需要的场合,提高代码质量。

总结

函数防抖其实是分为 “立即执行版” 和 “非立即执行版” 的,根据字面意思就可以发现他们的差别,所谓立即执行版就是 触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。 而 “非立即执行版” 指的是 触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数的效果。

在开发过程中,我们需要根据不同的场景来决定我们需要使用哪一个版本的防抖函数,一般来讲上述的防抖函数都能满足大部分的场景需求。但我们也可以将非立即执行版和立即执行版的防抖函数结合起来,实现最终的双剑合璧版本的防抖函数,以下为小伙伴们做了简单的实现:

/**
* @desc 函数防抖---“立即执行版本” 和 “非立即执行版本” 的组合版本
* @param func 需要执行的函数
* @param wait 延迟执行时间(毫秒)
* @param immediate---true 表立即执行,false 表非立即执行
**/
function debounce(func,wait,immediate) {
let timer;

return function () {
let context = this;
let args = arguments;

if (timer) clearTimeout(timer);
if (immediate) {
var callNow = !timer;
timer = setTimeout(() => {
timer = null;
}, wait)
if (callNow) func.apply(context, args)
} else {
timer = setTimeout(function(){
func.apply(context, args)
}, wait);
}
}
}

function handle(){
console.log(Math.random());
}

// window.addEventListener("mousemove",debounce(handle,1000,true)); // 调用立即执行版本
window.addEventListener("mousemove",debounce(handle,1000,false)); // 调用非立即执行版本

  

 

本文转载自:https://segmentfault.com/a/1190000019591549,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

标签:function,触发,防抖,函数,timer,JS,执行
From: https://www.cnblogs.com/yxg2852/p/17310574.html

相关文章

  • 解析566回调函数
    1.这是一个结构体,ConfigCallBack,是结构体别名,*pConfigCallBack是结构体指针  里面是两个函数指针,一个是GetConfigCB,一个是SetConfigCB.很明显是获取和设置配置的函数指针。2.实现    3.定义在类里面,然后类成员函数调用即可,用结构体别名定义 ......
  • SQL 时间函数
    转载自:SQL千字总结:如何更好的操练你手上的时间数据1.认识时间格式非标准时间格式:20200101可转换可识别时间格式:2020-12-12、2020-12-1212:12:12、1577836800说下时间戳:1577836800,表示1970年1月1日开始过去了多少秒2.时间格式转换2.1unix_timestamp和from_unixtimesele......
  • C#请求访问HTTP+JSON数据的解析
    一、前言最近工作客户需要一个HTTP的Mes需求,所以自己去学习了C#请求HTTP的方法以及JSON数据的解析方法,总结出了点经验,以便后续自己找起来方便一点,故在此写一篇文章。二、准备工作下面我用一个聚合数据提供的天气预报API接口来阐述请求HTTP和JSON数据解析的功能;先看API文档这么访......
  • vue pc使用htmlCanvas Jspdf 实现点击将页面生成图片并转成pdf下载
    <template><divid="main"ref="workbench"v-loading="loading"class="echartsPdf">需要的内容</div></template><script>importhtml2canvasfrom'html2canvas'importJspdf......
  • js new运算符
    1、new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。(通过构造函数来创建一个实例对象)2、new做了什么?   ①创建一个临时对象 ②为该临时对象添加属性 __proto__,将该属性链接至构造函数的原型对象(绑定原型)③将this指向该临时对象......
  • mysql——date_format(),str_to_date()函数
    date_format():类似python中的strftime: 将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制输出格式selectdate_format(datetime的字段,‘%Y-%m-%d’)括号中前面是你要格式化的字段,后面是具体要格式化成什么样式。 str_to_date():类似python中的strptime:将字......
  • centos7部署nodejs脚本
    在服务器运行nodejs脚本中,遇到三个问题,进行记录1.用到sharp依赖,但是在服务器上安装不成功,依赖会从github上下载不下来解决:设置使用sharp对应的镜像地址npmconfigsetsharp_binary_host"https://npmmirror.com/mirrors/sharp"npmconfigsetsharp_libvips_binary_host"ht......
  • js-函数记忆
    函数记忆:指将上次的(计算结果)缓存起来,当下次调用时,如果遇到相同的(参数),就直接返回(缓存中的数据)。实现原理:将参数和对应的结果保存在对象中,再次调用时,判断对象key是否存在,存在返回缓存的值。functionmemorize(){constcache={};returnfunction(){constkey=A......
  • Python json基本使用json.dumps() 和json.loads()
    Python中json的基本使用 json.dumps()和json.loads()JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它是JavaScript的子集,易于人阅读和编写。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式,现在也常用于http请求中。Python中可用json模块来......
  • Vue.js 路由的props配置
    视频index.js(解构赋值,连续解构赋值)Message.vue7.路由的props配置​ 作用:让路由组件更方便的收到参数{ name:'xiangqing', path:'detail/:id', component:Detail, //第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件 //pr......