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

yizhihongxing

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日

相关文章

  • fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法

    为了解决Fireworks菜单生成器mm_menu.js在IE 7.0中的显示问题,我们需要进行以下步骤: 步骤一:升级mm_menu.js 首先,我们需要下载最新版本的mm_menu.js文件,并将其替换掉原始的文件。最新版本的mm_menu.js可以从Dreamweaver的官网或其他网络资源库中获取。 步骤二:修改CSS样式 接下来,我们需要修改CSS…

    JavaScript 2023年5月28日
    00
  • 记录-JavaScript常规加密技术

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 当今Web开发中,数据安全是一个至关重要的问题,为了确保数据的安全性,我们需要使用加密技术。JavaScript作为一种客户端编程语言,可以很好地为数据进行加密。在本篇文章中,我们将为你提供一个常规JavaScript加密大全,以及案例代码来演示如何使用它们。 Base64加密 Base64是一种…

    JavaScript 2023年4月19日
    00
  • FCKeditor 和 SyntaxHighlighter 代码高亮插件的整合

    下面是关于“FCKeditor 和 SyntaxHighlighter 代码高亮插件的整合”的详细攻略。 概述 首先我们要理解这两个插件是什么。FCKeditor是一个基于Web的WYSIWYG文本编辑器,可以方便地进行文本排版,支持多种格式,具有图形用户界面。而SyntaxHighlighter是一个代码高亮插件,可以让我们方便地将代码高亮显示,并可以自定…

    JavaScript 2023年6月11日
    00
  • javascript针对DOM的应用分析(二)

    JavaScript针对DOM的应用分析 在使用JavaScript时,操作DOM是很重要的一部分。在本攻略中,我们将详细讨论JavaScript如何应用于DOM。 DOM基础知识 DOM(Document Object Model,文档对象模型)是指用于 HTML 和 XML 文档的编程接口。DOM 将整个页面抽象为一个树形结构,页面中的每个组成部分都是树…

    JavaScript 2023年6月10日
    00
  • JavaScript DOM 学习第三章 内容表格

    JavaScript DOM 学习第三章 内容表格攻略 1. 了解DOM中的Table对象 首先,了解DOM中的Table对象是学习内容表格的关键。Table对象分为三层:table对象本身、行对象tr以及单元格对象td。我们可以通过获取DOM元素的方式获取Table对象: var table = document.getElementsByTagName(…

    JavaScript 2023年6月10日
    00
  • DIV常见任务(下) —变身为编辑器及div的各种diy应用

    DIV常见任务(下) —变身为编辑器及div的各种diy应用 简介 在网页开发中,DIV是使用最多的元素之一,除了常规的布局外,DIV还可以通过一些diy的方式实现更多的功能,如编辑器、拖拽、手势识别等。本文将介绍DIV的一些diy应用,供读者学习参考。 DIV变身为编辑器 通过一些技巧和库,我们可以将DIV变身为一个简单的富文本编辑器,而无需使用第三方的J…

    JavaScript 2023年6月11日
    00
  • jQuery插件formValidator实现表单验证

    下面是详细的“jQuery插件formValidator实现表单验证”的攻略: 1. 简介 formValidator是一款基于jQuery的插件,它可以让你快速、简单地实现表单验证功能。它支持各种类型的表单元素,包括文本框、多选框、下拉列表等等。同时,它还提供了很多预定义的验证规则,如必填、邮箱、手机号码等等。 2. 安装和使用 2.1 安装 formVa…

    JavaScript 2023年6月10日
    00
  • 记录 Promise 的方法

    Promise 是异步编程的一种解决方案,比传统的回调函数或事件更合理和更灵活。 Promise 方法 Promise的原型方法:then/catch/finally,这三种方法很常用,then用于处理Promise转为fulfilled状态时的代码,catch用于处理Promise转为rejected状态时的代码(当然then的第二个参数也可处理rejec…

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