JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)

yizhihongxing

JavaScript性能优化之函数节流与函数去抖

函数节流(throttle)和函数去抖(debounce)都是 JavaScript 中常用的性能优化技巧。它们都是用来解决频繁触发回调函数导致过多计算使页面出现卡顿或资源浪费的问题。

函数节流 throttle

函数节流的基本思路是:在一定时间间隔内,只执行一次函数。通过这种方式,可以减少计算次数,提升性能。一般适用于 window.resize,scroll 等事件。

实现原理

函数节流的实现原理是不断地记录当前是否已经有延时函数在等待执行。如果有,则不再继续触发新的延时函数;如果没有,则新建一个延时函数并交给 setTimeout 执行。

代码示例

下面给出一个简单的函数节流代码示例:

function throttle(fn, delay) {
  let timer = null;
  return function (...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null; // 注意重置定时器
      }, delay);
    }
  };
}

// 用法示例
window.addEventListener(
  "resize",
  throttle(() => {
    console.log("resize event occured");
  }, 100)
);

在上面的示例中,我们定义了一个 throttle 函数,接受一个回调函数 fn 和一个时间间隔 delay。在 throttle 内部,维护了一个 timer 变量用来记录是否已经有计时器在等待执行。在回调函数被触发时,我们首先判断 timer 是否已存在。如果不存在,说明没有计时器等待执行,我们就新建一个计时器并将其赋值给 timer。通过 setTimeout 函数,我们让延时执行回调函数,并在执行后重置 timer。这样就可以实现函数节流的效果了。

函数去抖 debounce

函数去抖的原理与函数节流相似,但在实现上略有不同:函数去抖是在一定时间段内,只有最后一次触发事件才会执行相应的回调函数。一般适用于搜索框等需求,防止用户输入速度过快导致频繁触发请求。

实现原理

去抖函数的实现原理实际上就是不停地清除之前设置的计时器,并新建一个计时器等待下一次事件触发。只有在最后一次事件触发时,才会执行回调函数。

代码示例

下面给出一个简单的函数去抖代码示例:

function debounce(fn, delay) {
  let timer = null;
  return function (...args) {
    if (timer) {
      clearTimeout(timer); // 如果计时器还在等待中,则清除计时器
    }
    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, delay);
  };
}

// 用法示例
const searchBox = document.getElementById("search-box");
searchBox.addEventListener(
  "input",
  debounce(() => {
      console.log("search box content changed");
  }, 500)
);

在上面的代码示例中,我们定义了一个 debounce 函数,接受一个回调函数 fn 和一个时间间隔 delay。在 debounce 内部,维护了一个 timer 变量用来记录是否已经创建计时器。在回调函数被触发时,我们首先判断 timer 是否已存在。如果存在,说明上一次事件触发后还存在等待执行的计时器,我们就需要先清除计时器。通过 setTimeout 函数,我们让计时器开始等待,并在执行后重置 timer。这样,只有最后一次事件触发时,才会执行回调函数。

总结

函数节流和函数去抖是 JavaScript 常用的性能优化技巧,常用于优化频繁触发的事件处理。函数节流和函数去抖有一些相似之处,但在实现上还是有一定的区别的。对于不同的场景,我们可以选择合适的技巧来优化我们的代码,提高性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript性能优化之函数节流(throttle)与函数去抖(debounce) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 理解javascript中的严格模式

    理解 JavaScript 中的严格模式需要掌握以下内容: 严格模式是什么; 为什么要使用严格模式; 如何开启严格模式; 严格模式下的限制和变化。 接下来我将逐一解释。 1. 严格模式是什么 简单来说,严格模式是 ES5 中新增的一种执行模式,它使得 JavaScript 引擎在执行 JavaScript 代码时,会对一些不规范的语法和疏忽进行提示或者直接报…

    JavaScript 2023年5月18日
    00
  • Javascript Math max() 方法

    JavaScript中的Math.max()方法是用于返回一组数中的最大值的函数。以下是关于Math.max()方法的完整攻略,包含两个示例。 JavaScript Math对象的max()方法 JavaScript Math中的max()方法用于返回一数中的最大值。下面是max()方法的语法: Math.max([value1[,2[, …]]]) 其…

    JavaScript 2023年5月11日
    00
  • js表单事件详细汇总

    关于“js表单事件详细汇总”的完整攻略,我将分为五部分进行讲解。 第一部分:什么是表单事件 表单事件是在用户与表单交互时触发的JavaScript方法。表单事件绑定在表单元素上,例如input、button、form等。 第二部分:表单事件的使用方法 表单事件可以通过addEventListener()或on事件属性来绑定。addEventListener(…

    JavaScript 2023年6月10日
    00
  • JavaScript遍历数组的方法代码实例

    当我们需要对JavaScript中的数组进行遍历时,我们有多种方法来实现。接下来我会详细讲解几种常用的JavaScript遍历数组的方法以及相应的代码实例。 1. for循环 通过 for 循环,我们可以轻松地遍历 JavaScript 数组。 // 遍历数组 let arr = ["apple", "banana",…

    JavaScript 2023年5月27日
    00
  • 用 Javascript 验证表单(form)中的单选(radio)值

    下面是用 JavaScript 验证表单中的单选(radio)值的完整攻略: 1. 获取单选按钮的值 首先,我们需要通过 document.getElementsByName() 方法获取所有同名的单选按钮,然后循环遍历每个单选按钮,判断哪个单选按钮被选中(即 checked 属性为 true)。 下面是一个获取选中的单选按钮值的示例代码: // 获取所有同…

    JavaScript 2023年6月10日
    00
  • 聊一聊JavaScript作用域和作用域链

    下面是详细讲解“聊一聊JavaScript作用域和作用域链”的完整攻略。 JavaScript中的作用域 JavaScript中的作用域是指变量的适用范围,也就是变量能够被访问的区域。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。 全局作用域 全局作用域是指在所有函数外部定义的变量,它的作用域范围是整个JavaScript程序。在全局作…

    JavaScript 2023年5月28日
    00
  • javascript学习笔记之10个原生技巧

    Javascript学习笔记之10个原生技巧 简介 这篇学习笔记将会介绍10个用Javascript技巧的原生方法。这些方法将会帮助你提高你的Javascript编程能力,让你写出简单、优雅、高效的代码。 1. 使用 Array.map() 进行数组的元素转换 Array.map() 方法可以将一个数组的所有元素都通过一个提供的函数进行转换。它不会改变原来的…

    JavaScript 2023年5月18日
    00
  • 很全面的JavaScript常用功能汇总集合

    欢迎来到网站,以下是“很全面的JavaScript常用功能汇总集合”的完整攻略。 什么是JavaScript常用功能汇总集合 JavaScript常用功能汇总集合是一个包含了常见的JavaScript功能和代码示例的集合,涵盖了诸如数组操作、字符串处理、函数式编程、事件处理等常用功能。通过本集合,您可以快速地获取JavaScript开发过程所需的绝大部分基础…

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