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):防止用户在调整窗口时,触发过多的无用事件。
  • 函数节流应用场景:

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

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

目录
相关文章
|
2月前
|
JavaScript 前端开发
JavaScript中有哪几种循环?他们的运用场景在哪?
JavaScript中有哪几种循环?他们的运用场景在哪?
|
1月前
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
101 57
|
4月前
|
前端开发 JavaScript Java
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
56 3
|
4月前
|
JavaScript 前端开发 UED
深入理解JavaScript中的节流与防抖技术
理解并合理运用节流与防抖技术,可以帮助我们优化事件处理函数的执行频率,从而提升应用的性能和用户体验。这两种技术通过减少不必要的计算和DOM操作,使得Web应用程序能够更加流畅地运行。 通过掌握防抖和节流的实现原理及应用场景,开发者可以更加灵活地编写高效且性能优化的代码,对于面对高频事件处理时尤其重要。在开发中合理选择使用防抖或节流,将直接影响到应用的响应性和效率。
48 1
|
1月前
|
自然语言处理 JavaScript 前端开发
JS中this的应用场景,再了解下apply、call和bind!
该文章深入探讨了JavaScript中`this`关键字的多种应用场景,并详细解释了`apply`、`call`和`bind`这三个函数方法的使用技巧和差异。
|
2月前
|
JavaScript 前端开发 UED
JS 防抖与节流
防抖和节流是优化高频事件处理的技术。针对如`scroll`、`resize`等频繁触发的事件,它们能有效减少不必要的回调执行,节省资源。防抖确保在一段时间内仅执行最后一次操作,适用于输入框自动补全等场景;而节流则按固定间隔执行函数,适合拖拽、滚动事件。通过简单的JavaScript实现,可以显著提升应用性能和用户体验。
31 1
JS 防抖与节流
|
2月前
|
存储 JavaScript 前端开发
JavaScript——对闭包的看法,为什么要用闭包?说一下闭包原理以及应用场景
JavaScript——对闭包的看法,为什么要用闭包?说一下闭包原理以及应用场景
35 0
|
3月前
|
JavaScript 前端开发 物联网
Node.js一般在什么场景下使用?
Node.js是一个基于Chrome V8 JavaScript引擎构建的开源运行时环境,它允许开发者使用JavaScript在服务器端运行代码。Node.js具有高性能、轻量级、事件驱动和非阻塞I/O等特性,这些特性使得它在多种场景下具有广泛的应用。
37 0
|
3月前
|
JavaScript API 索引
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
59 0
|
3月前
|
JSON JavaScript API
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
72 0