首页 > 其他分享 >js节流函数与防抖函数

js节流函数与防抖函数

时间:2023-06-26 09:26:08浏览次数:29  
标签:function 触发 防抖 函数 js let 节流

防抖函数和节流函数都是为了解决JavaScript中频繁触发事件而导致的性能问题,但它们的实现方式和使用场景有所不同。

一、防抖函数

防抖函数的作用是在事件触发后一定时间内没有再次触发该事件时,才执行处理方法。简单来说,就是在最后一个事件被触发后,还要等待一段时间,如果这段时间内没有再次触发事件,才执行相应的处理方法。

实现防抖函数的关键点在于设置一个定时器,在事件被触发时先清除之前设置的定时器,然后重新设置一个新的定时器,当计时器到期后执行相应的处理方法。

防抖函数适合处理诸如窗口调整、滚动等连续触发事件,并且只需要处理最后一次事件的情况。

function debounce(fn, delay) {
  let timer = null;
  return function () {
    let context = this;
    let args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}

二、节流函数

节流函数的作用是在一定时间间隔内最多只能触发一次事件。换句话说,就是限制事件触发的频率,避免过多的事件处理,从而提高效率。

实现节流函数的关键点在于设置一个标记变量,用来表示当前是否可以执行处理方法。当事件被触发时,先判断标记变量的值,如果为真,则执行相应的处理方法,并将标记变量设为假,然后等待一段时间后再将标记变量设为真。

节流函数适合处理诸如鼠标移动、窗口滚动等连续触发事件,并且需要限制事件处理频率的情况。

function throttle(fn, delay) {
  let flag = true;
  return function () {
    let context = this;
    let args = arguments;
    if (flag) {
      flag = false;
      setTimeout(function () {
        fn.apply(context, args);
        flag = true;
      }, delay);
    }
  };
}

三、调用方法

使用防抖函数节流函数的时候,需要传入两个参数:处理方法和时间间隔。

防抖函数的调用示例:

function handle() {
  console.log('handle');
}

let debounceHandle = debounce(handle, 300); // 将原来的处理方法传入防抖函数,并指定时间间隔

element.addEventListener('scroll', debounceHandle); // 将防抖处理方法绑定到事件上

节流函数的调用示例:

function handle() {
  console.log('handle');
}

let throttleHandle = throttle(handle, 500); // 将原来的处理方法传入节流函数,并指定时间间隔

element.addEventListener('scroll', throttleHandle); // 将节流处理方法绑定到事件上

本文以监听dom元素的滚动事件为例,先将原始的处理方法 handle 传入防抖或者节流函数,并由新的函数返回。然后将返回的函数作为事件处理方法,并绑定到dom元素上。这样每次触发事件时就会执行防抖或者节流处理方法,从而达到优化性能的目的。


标签:function,触发,防抖,函数,js,let,节流
From: https://www.cnblogs.com/bokemoqi/p/17504466.html

相关文章

  • 前端 js 获取 baseurl
    如果部署一个网站到网络需要知道对应的ip,这个时候前端的baseurl需要动态调整,一般是在public里面写个config.js,部署的时候改这个config.js里面的内容有一种偷懒的方式就是用户是知道你的ip的,这个时候可以用window.location.host获取当前浏览器的host网址拿这个当bas......
  • python map函数
    map函数是python提供的内嵌函数,所以不需要import,可以直接使用作用是,将第一个参数的功能,作用于第二个参数的每一个元素举例:>>>defsquare(x):#计算平方数...returnx**2...>>>map(square,[1,2,3,4,5])#计算列表各个元素的平方[1,4,9,16,25]......
  • flv.js视频流出错,断流处理
    flv.js视频流出错,断流处理可乐加冰5152023年02月20日17:45 ·  阅读274场景:前端使用flv.js播放视频流Bug表现:视频流播放两分钟左右video标签出现暂停按钮,控制台flv.js报错:Failedtoexecute'appendBuffer'on'SourceBuffer':TheHTMLMediaElement.erroratt......
  • JS(数组)
    一数组的概念问:之前学习的数据类型,只能存储一个值。如果我们想存储班级中所有学生的姓名,那么该如何存储呢?答:可以使用数组(Array)。数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式。问:什么是数组呢?答:数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存......
  • springboot中自定义JavaBean返回的json对象属性名称大写变小写问题
    目录一、继承类二、手动添加Get方法三、@JsonProperty四、spring-bootjson(jackson)属性命名策略开发过程中发现查询返回的数据出现自定义的JavaBean的属性值大小写格式出现问题,导致前端无法接受到数据,目前有四种解决方法,根据大佬的经验之谈,前两种是最简单便捷的,后两种是比较通......
  • 使用flv.js直播不能自动播放的问题
    使用flv.js直播不能自动播放的问题问题使用Flv.js做直播,最近发现进入页面后不能自动播放。原因查询了一下发现是因为Chromeautoplaypolicy的影响。目前的解决方案由于项目的视频不需要播放音频,所以直接给video标签加上muted属性,进入后可以自动播放。......
  • 强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函
    强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)1.核心词汇策略(policy):在每一个演员中会有对应的策略,这个策略决定了演员的后续动作。具体来说,策略就是对于外界的输入,输出演员现在应该要执行的动作。一般地,我......
  • 强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函
    强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)1.核心词汇策略(policy):在每一个演员中会有对应的策略,这个策略决定了演员的后续动作。具体来说,策略就是对于外界的输入,输出演员现在应该要执行的动作。一般地,我们......
  • 文件上传-js前端验证
    先上传一个文件看看  这里有标识文件类型 方法一:禁用js前端验证使用工具禁用所有的js脚本  或者修改onsubmit参数      保证 returncheckFile()函数返回值为true 第二种方法: 上传png文件改为php后缀远程执行命令,回显成功......
  • 记一次曲折的fastjson事件应急响应
    01事件背景介绍某内部应急演练中,安全部门收到通知,称公司内部资产被入侵,且可能已经开始内网横向入侵,现需根据流量情况进行安全事件分析。02事件分析过程通过数据包发现10.X.X.2对80.X.X.1/24使用扫描器发起扫描,包括80.X.X.12,80.X.X.48,80.X.X.61查看源IP80.X.X.12外连情况发现无......