JS中节流和防抖函数的实现及区别示例

JS中的节流和防抖函数是常见的性能优化方案,它们可以有效减少大量事件触发时造成的性能浪费。接下来我将详细讲解它们的实现方法及区别,并提供两个示例说明。

一、防抖函数

防抖函数是指在事件触发n秒后,才会执行回调函数,如果在n秒内又触发了该事件,则重新计算时间。这个操作就像是“弹簧被压下去后在n秒后才能弹起来”。

防抖函数的实现方法如下:

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

上述防抖函数的实现方法的意思是:每当事件被触发时(比如说用户滚动事件、点击事件、输入框输入事件等等),会清除之前延时执行的回调函数的定时器,然后再设置一个新的延时计时器。如果在delay的时间内再次触发该事件,定时器会被清除,重新计算时间,不会执行回调函数,直至n秒后,定时器未被清除,执行回调函数。

以下是一个防抖函数的示例说明:

function handleClick() {
  console.log('点击了')
}
const button = document.querySelector('button')
button.addEventListener('click', debounce(handleClick, 1000))

上述代码中,给按钮添加点击事件,每次点击后一秒内不会再次触发该事件,防止用户多次点击导致不必要的重复操作。

二、节流函数

节流函数是指当事件被触发时,频率限制在一定时间内只执行一次回调函数。这个操作就像是“水龙头在一定时间内按一次只能供应一份水”。

节流函数的实现方法如下:

function throttle(fn, delay) {
  let lastTime = 0
  return function() {
    const nowTime = Date.now()
    if(nowTime - lastTime > delay) {
      fn.apply(this, arguments)
      lastTime = nowTime
    }
  }
}

上述节流函数的实现方法的意思是:每当事件被触发时,首先获取该事件的当前时间,如果当前时间与上一次事件触发时间间隔超过了指定的时长delay,则执行回调函数,否则忽略该次事件的触发。

以下是一个节流函数的示例说明:

function handleScroll() {
  console.log('滚动了')
}
window.addEventListener('scroll', throttle(handleScroll, 1000))

上述代码中,给window对象添加了滚动事件,在一秒内最多只会触发一次该事件的回调函数,减少了因用户的快速滑动导致的重复操作,使页面更加流畅。

三、区别与应用场景

防抖与节流的区别在于:

  • 防抖函数是在一定时间内多次触发事件,只执行最后一次事件的回调函数,可以防止频繁的触发无意义的操作;
  • 而节流函数则是在一定时间内限制事件触发次数,使回调函数能够以固定且合适的频率执行,适用于一些需要稳定执行而忽略间隔时间的场景。

因此,应用场景不同,任选其一取决于实际需求。例如,用户搜索时,防抖能够减少请求次数,提高搜索效率,而鼠标移动时的实时监测事件触发则需要使用节流,限制事件触发频率,减少浏览器性能消耗,保持页面流畅。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中节流和防抖函数的实现及区别示例 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 使用JavaScript计算前一天和后一天的思路详解

    十分感谢您的提问,我将为您提供如下对“使用JavaScript计算前一天和后一天的思路详解”的详细讲解攻略。 简介 首先,我们需要了解一下时间相关的标准,JavaScript中常见的有三种时间格式:时间戳、日期时间字符串、Date对象。其中,时间戳(Unix Timestamp / Epoch Time)一般指的是从1970年1月1日00:00:00至现在的…

    JavaScript 2023年5月27日
    00
  • ES6字符串和数值新增方法总结

    ES6字符串和数值新增方法总结 以下是ES6中常用的字符串和数值方法。 字符串方法 startsWith(searchString[, position]): 检查字符串是否以指定子字符串开头。 示例: let str = ‘Hello World!’; console.log(str.startsWith(‘Hello’)); // true consol…

    JavaScript 2023年5月28日
    00
  • 仿3721首页模块拖曳移动效果js代码[可拖曳层移动层]

    “仿3721首页模块拖曳移动效果js代码[可拖曳层移动层]”是一种常见的网页可交互功能,下面我将详细讲解如何实现该功能的完整攻略: 1. 准备工作 在实现拖曳移动效果前,我们需要准备一些基础的工作: 1.在 HTML 文件中添加需要被拖曳的标签 2.使用 CSS 设置被拖曳标签的默认样式 3.导入拖曳移动所需的 JavaScript 库 2. 实现拖曳移动效…

    JavaScript 2023年6月11日
    00
  • JavaScript时间日期操作实例小结【5个示例】

    下面我来为你详细讲解“JavaScript时间日期操作实例小结【5个示例】”的完整攻略。 JavaScript时间日期操作实例小结【5个示例】攻略 1. 日期格式化 这是一个小例子,它可以将日期格式化为想要的样式,例如 2022-01-01 00:00:00。你可以使用 JS 中的 Date 对象和一些方法实现。 function formatDate(da…

    JavaScript 2023年5月27日
    00
  • 浅谈JavaScript中this的指向更改

    浅谈JavaScript中this的指向更改 在JavaScript中,函数的 this 关键字指向的是调用函数的对象,而不同的函数调用方式会影响 this 的指向。本文将详细讨论如何通过不同的方式来更改 this 的指向。 使用 call() 方法 call() 方法可以传递一个对象,并将其作为函数中的 this。例如: let obj = { name:…

    JavaScript 2023年6月10日
    00
  • 5款Ajax 文件上传控件

    Ajax文件上传控件是很常见的一些Web技术之一,它可以使得网页用户在不刷新页面的情况下上传文件,并且可以在上传的过程中实时显示上传进度。这里我们介绍5款常见的Ajax文件上传控件。 1. AjaxUpload AjaxUpload是一种轻量级文件上传控件,代码很少,使用也非常简单,只需要用一个额外的JS文件即可。下面是一个简单的演示: new AjaxUp…

    JavaScript 2023年6月11日
    00
  • JS中可能会常用到的一些数据处理方法

    下面是关于JS中可能会常用到的一些数据处理方法的详细攻略。 1. 字符串处理方法 1.1 字符串的拼接 在JS中,我们可以使用加号 (+) 来实现字符串的拼接。例如:var str1 = “Hello,”; var str2 = “world!”; var result = str1 + ” ” + str2; 此时 result 的值为 Hello, wo…

    JavaScript 2023年6月10日
    00
  • javascript条件式访问属性和箭头函数介绍

    下面我将为您详细讲解“JavaScript条件式访问属性和箭头函数介绍”的完整攻略。 JavaScript条件式访问属性 1. 定义 条件式访问属性是一种在对象中访问属性的技术,可以更简洁地检查对象和属性是否存在,以避免出现 undefined 和 TypeError。 2. 示例 以下是一种常规方式来检查对象的属性和属性是否存在: if (obj &amp…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部