首页 > 其他分享 >js防抖和节流的实现原理及应用场景

js防抖和节流的实现原理及应用场景

时间:2022-12-19 17:12:13浏览次数:33  
标签:触发 防抖 return 节流 js true 函数

概念
函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

函数节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象

1、函数防抖(debounce)

  • 实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法
  • 缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟

1)应用场景:

  1. scroll事件滚动
  2. 浏览器窗口的缩放resize事件
  3. 搜索框输入查询的时候
  4. 表单验证
  5. 按钮的提交事件

2)代码

 1 function debounce (fn, delay = 1000) {
 2   let time = null
 3   return function () {
 4     // 获取当前this
 5     let that = this
 6     // 判断是否已经存在,如果存在直接清除
 7     if (time) {
 8       clearTimeout(time)
 9     }
10     time = setTimeout(() => {
11       // 使fn 中this,执行当前调用者,并传入参数
12       fn.apply(that, arguments)
13     }, delay)
14   }
15 }

1,函数节流(throttle)

  • 实现方式:每次触发事件时,如果当前有等待执行的延时函数,则直接return

1)应用场景:

  1. DOM元素拖拽功能实现
  2. 计算鼠标移动距离
  3. 监听scroll滚动事件请求数据
  4. 搜索、提交等按钮功能

2)代码

 1 function throttle(fn,delay) {
 2     let canRun = true; // 通过闭包保存一个标记
 3     return function () {
 4          // 在函数开头判断标记是否为true,不为true则return
 5         if (!canRun) return;
 6          // 立即设置为false
 7         canRun = false;
 8         // 将外部传入的函数的执行放在setTimeout中
 9         setTimeout(() => { 
10         // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。
11         // 当定时器没有执行的时候标记永远是false,在开头被return掉
12             fn.apply(this, arguments);
13             canRun = true;
14         }, delay);
15     };
16 }

 

标签:触发,防抖,return,节流,js,true,函数
From: https://www.cnblogs.com/fxw1996/p/16992600.html

相关文章

  • js实现深拷贝和浅拷贝
    1,深拷贝与浅拷贝的区别深拷贝:主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,它自己在堆中开辟了自己的内存区域,不受外界干扰。浅拷贝:主要拷贝......
  • vuejs处理树状结构的数据扁平化
    1,有这样一个数据:1data=[2{3"id":1,4"name":"吃喝",5"parentId":0,6"children":[7......
  • JavaScrip基础(一):JS基础认知
    JavaScript基础认知定义:是一种运行于JavaScript解释器/引擎中的解释型脚本语言什么是解释型?运行之前不不需要编译的,运行之前不会检查错误,知道碰到错误为止。解释型对应......
  • vuejs实现一键复制功能
    1,首先安装插件:npminstallclipboard--sava2,在组件中应用 importClipboardfrom'clipboard'3,clipboard的实际使用1<!--第一种直接绑定在按钮上-->2<bu......
  • 菜单栏-JS防抖
    一、需求写一个菜单栏,能够实现:鼠标悬浮时展开子菜单鼠标离开时折叠子菜单二、简单实现+问题简单绑定mouseovermouseleave实现折叠和展开。容易抽风,表现为,鼠......
  • Node.js
    下载安装node.jshttps://nodejs.org/zh-cn/download/npm安装yarn安装npminstall-gyarn切换淘宝镜像yarnconfigsetregistryhttps://registry.npm.taobao.orgy......
  • When to use next() and return next() in Node.js
    Somepeoplealwayswritereturnnext()istoensurethattheexecutionstopsaftertriggeringthecallback.Ifyoudon'tdoit,yourisktriggeringthecallback......
  • <%@ include file=""%>与<jsp:include page=""/>区别
         通常当应用程序中所有的页面的某些部分(例如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include。具体在哪些时候用<%@includefile=""%>,哪些时候用<jsp:in......
  • vuejs实现文件下载的三种方式
    第一种方式是前端创建超链接,通过a标签的链接向后端服务发get请求,接收后端的文件流,非常简单:<a:href='"/路径"'>下载模板</a>另一种情况是创建div标签,动态创建a标签:<div......
  • Jsp底层实现原理
    JSP底层原理分析在WEB-INF目录外创建一个index.jsp文件将项目部署成功之后启动服务器,浏览器访问该jsp页面,在服务器启动页面可以看到CATALINE_BASE这个信息org.......