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

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函数防抖与函数节流的定义及使用详解 函数防抖和函数节流是 JavaScript 常用的两种优化方案。它们可以延迟函数的执行,减少频繁请求和高频事件造成的性能问题。 一、函数防抖 在 JavaScript 中,如果频繁触发某个事件,比如输入框输入,鼠标滚动等,可能会造成函数频繁执行,影响性能。而使用函数防抖可以延迟函数的执行,只有等到一段时…

    JavaScript 2023年5月27日
    00
  • Vuejs使用addEventListener的事件如何触发执行函数的this

    当我们在Vuejs中使用addEventListener添加事件监听器时,我们需要注意事件处理函数的this指向问题。如果我们使用传统的写法编写事件监听函数,那么this指向的就是监听器所在的DOM元素。在Vuejs中,我们的事件处理函数需要绑定到Vue实例上,这样才能使用Vue实例中的数据和方法。 下面是一些如何解决Vuejs中addEventListen…

    JavaScript 2023年6月11日
    00
  • JS简单生成由字母数字组合随机字符串示例

    当我们需要生成随机字符串的时候,可以使用JS代码来实现。下面是一些简单的JS代码示例可以生成由字母数字组合随机字符串。 方法一:使用Math.random()方法生成随机数 代码示例: /** * 生成指定长度的随机字符串(由字母数字组成) * @param {number} length 需要生成的字符串长度 * @returns {string} 生成的…

    JavaScript 2023年5月28日
    00
  • WebSocket与Sock.js介绍

    WebSocket与Sock.js介绍 今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管管,团队建设 有参考作用 , 您可能感兴趣的文章: 领导人怎样带领好团队构建创业公司突击小团队国际化环境下系统架构演化微服务架构设计视频直播平台的系统架构演化微服务与Docker介绍Docker与CI持续集成/CD互联…

    JavaScript 2023年4月24日
    00
  • 基于redis的小程序登录实现方法流程分析

    下面我会给出“基于redis的小程序登录实现方法流程分析”的完整攻略。 标题一:前置要求 在开始讲解具体的实现方法前,我们需要先完成以下前置要求: 拥有一个小程序开发者账号并注册小程序。 安装node.js和npm。 安装redis,并且启动redis服务。 标题二:实现步骤 步骤一:安装必要的依赖 我们首先需要安装必要的依赖: npm install ko…

    JavaScript 2023年5月19日
    00
  • javascript开发随笔二 动态加载js和文件

    我将详细讲解一下“javascript开发随笔二 动态加载js和文件”的完整攻略。 什么是动态加载js和文件? 动态加载指的是在页面运行时动态地加载一些脚本或文件。相比静态加载,在需要的时候才加载脚本或文件,可以有效提高页面的加载速度和响应速度。 如何动态加载js和文件? 动态加载js脚本 要动态加载一个js脚本,可以使用document.createEle…

    JavaScript 2023年5月27日
    00
  • 详解js中Json的语法与格式

    下面是详解“详解js中Json的语法与格式”的完整攻略。 什么是 JSON JSON(Javascript Object Notation)是一种轻量级的数据交换格式,在前端开发中广泛应用。它基于JavaScript对象语法,但是可以被用于保存和交换任何类型的数据。 JSON 的语法 JSON的语法非常简洁,只有两种结构:对象(Object)和数组(Arra…

    JavaScript 2023年5月27日
    00
  • ES6 更易于继承的类语法的使用

    ES6 引入了 class 语法,从而使得 JavaScript 的面向对象编程更加易于使用和维护。这里是一些使用 ES6 类语法的实用指南: 创建一个类 ES6 class 语法允许你使用 class 关键字来创建一个类,并在类中定义属性和方法。下面是一个简单的类创建示例: class Person { constructor(name, age) { t…

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