JavaScript 中的函数防抖与节流详解及实用场景

简介: 在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。

函数防抖(Debounce)

定义:

函数防抖的基本思想是在事件被触发后,等待一段时间,如果这段时间内事件再次被触发,则重新计时。在等待时间结束后,只有最后一次事件触发会执行对应的回调函数。

实现:

function debounce(func, delay) {
   
  return function (args) {
   
    let that = this;
    let _args = args;
    clearTimeout(func.id);
    func.id = setTimeout(() => {
   
      func.call(that, _args);
    }, delay);
  };
}

说明:

  • debounce 函数接受两个参数:需要执行的函数 func 和延迟时间 delay
  • 在防抖机制中,如果在 delay 时间内触发了新的事件,计时器会重新开始,只有当一定时间内没有再次触发事件时,才会执行回调。

函数节流(Throttle)

定义:

函数节流的核心思想是限制一个函数在特定时间内只能执行一次。即使事件在该时间段内多次触发,也只会执行一次函数。这样可以有效控制高频率事件的调用次数。

实现:

function throttle(func, delay) {
   
  let last, deferTimer;
  return function (args) {
   
    let that = this;
    let _args = arguments;
    let now = +new Date();

    if (last && now < last + delay) {
   
      clearTimeout(deferTimer);
      deferTimer = setTimeout(function () {
   
        last = now;
        func.apply(that, _args);
      }, delay);
    } else {
   
      last = now;
      func.apply(that, _args);
    }
  };
}

说明:

  • throttle 函数同样接受两个参数:需要执行的函数 func 和延迟时间 delay
  • 当函数被调用时,如果距离上次调用的时间未超过 delay,则本次调用会被忽略。如果超过了,函数会立即执行。

使用示例

以下代码展示了如何使用防抖函数 debounce 来防止频繁的输入触发 ajax 请求。

function ajax(content) {
   
  console.log('ajax: ' + content);
}

let inputContent = document.getElementById('inputCon');
let debounceAjax = debounce(ajax, 500);

inputContent.addEventListener('keyup', function (e) {
   
  debounceAjax(e.target.value);
});

总结:

  • 函数防抖(debounce) 适用于当事件频繁触发且我们只关心最后一次触发的情况,例如用户输入框联想搜索。
  • 函数节流(throttle) 适用于在单位时间内只执行一次事件响应的场景,如滚动事件的滚动检测或按钮防连点。

综合使用场景

  • 函数防抖应用场景:

    • 搜索框自动补全:当用户输入搜索关键词时,只在用户停止输入一定时间后再发送请求,减少不必要的网络请求。
    • 窗口大小调整事件(resize):防止用户在调整窗口时,触发过多的无用事件。
  • 函数节流应用场景:

    • 滚动加载:在用户滚动页面时,节流可以确保检查是否到底部触发加载更多内容时的函数不会被频繁调用。
    • 鼠标点击事件:防止按钮被用户多次快速点击,确保按钮点击事件在一定时间内只能触发一次。

通过合理运用防抖与节流,可以有效提高页面性能,减少不必要的函数调用,从而提升用户体验。

目录
相关文章
|
4月前
|
缓存 自然语言处理 JavaScript
JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
闭包是JavaScript中不可或缺的部分,它不仅可以增强代码的可维护性,还能在模块化、回调处理等场景中发挥巨大作用。然而,闭包的强大也意味着需要谨慎使用,避免潜在的性能问题和内存泄漏。通过对闭包原理的深入理解以及在实际项目中的灵活应用,你将能够更加高效地编写出简洁且功能强大的代码。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
11月前
|
JavaScript 前端开发
JavaScript中有哪几种循环?他们的运用场景在哪?
JavaScript中有哪几种循环?他们的运用场景在哪?
|
前端开发 JavaScript Java
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
154 3
|
JavaScript 前端开发 UED
深入理解JavaScript中的节流与防抖技术
理解并合理运用节流与防抖技术,可以帮助我们优化事件处理函数的执行频率,从而提升应用的性能和用户体验。这两种技术通过减少不必要的计算和DOM操作,使得Web应用程序能够更加流畅地运行。 通过掌握防抖和节流的实现原理及应用场景,开发者可以更加灵活地编写高效且性能优化的代码,对于面对高频事件处理时尤其重要。在开发中合理选择使用防抖或节流,将直接影响到应用的响应性和效率。
125 1
|
7月前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
101 3
|
10月前
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
163 57
|
8月前
|
分布式计算 JavaScript 前端开发
在 JavaScript 中,哪些场景需要考虑精度控制?
【10月更文挑战第29天】JavaScript在上述各种场景中都需要根据具体的业务需求和数据特点,合理地进行精度控制,以确保计算结果的准确性和可靠性,从而为用户提供正确、稳定的服务和体验。
|
10月前
|
自然语言处理 JavaScript 前端开发
JS中this的应用场景,再了解下apply、call和bind!
该文章深入探讨了JavaScript中`this`关键字的多种应用场景,并详细解释了`apply`、`call`和`bind`这三个函数方法的使用技巧和差异。
|
11月前
|
JavaScript 前端开发 UED
JS 防抖与节流
防抖和节流是优化高频事件处理的技术。针对如`scroll`、`resize`等频繁触发的事件,它们能有效减少不必要的回调执行,节省资源。防抖确保在一段时间内仅执行最后一次操作,适用于输入框自动补全等场景;而节流则按固定间隔执行函数,适合拖拽、滚动事件。通过简单的JavaScript实现,可以显著提升应用性能和用户体验。
82 1
JS 防抖与节流

热门文章

最新文章