JavaScript 防抖debounce与节流thorttle

JavaScript 防抖 debounce 与节流 throttle

在 JavaScript 中,由于一些操作会频繁触发,如缩放、滚动等,可能会造成一些性能上的问题。而防抖和节流是一些用于解决这类问题的优化手段。

防抖 debounce

所谓防抖,就是指一个函数在一定时间内无论被触发多少次,都只会执行一次。这里的时间指的就是防抖的延迟时间,只有当该时间结束后,函数才会被执行一次。

下面是一段防抖的示例代码:

/**
 * 防抖函数
 * @param {Function} func 需要执行的函数
 * @param {number} delay 延迟执行的时间(单位:毫秒)
 * @returns {Function} 返回防抖处理后的函数
 */
function debounce(func, delay) {
  let timer = null;

  return function() {
    const context = this;
    const args = arguments;

    if (timer) clearTimeout(timer);

    timer = setTimeout(() => {
      func.apply(context, args);
    }, delay);
  }
}

/**
 * 使用示例
 */
function doSomething() {
  console.log('do something');
}

const debouncedDoSomething = debounce(doSomething, 1000);

window.addEventListener('scroll', debouncedDoSomething);

这段代码中,我们定义了一个 debounce 函数,它将需要执行的函数和延迟执行的时间作为参数。在函数内部,我们创建了一个 timer 变量,用于存放 setTimeout 返回的定时器 ID。在执行函数时,我们首先保存当前执行上下文和参数,如果 timer 已存在,则清除它。然后使用 setTimeout 创建一个定时器,在指定的延迟时间后执行函数。

在使用时,我们可以将需要执行的函数和防抖延迟时间作为参数传入 debounce 函数,得到一个新的防抖处理过的函数。在这里,我们给 window 对象的 scroll 事件监听函数传入了这个新的防抖函数,以实现防抖的效果。

节流 throttle

与防抖不同,节流是指一个函数在一定时间内最多只能执行一次。这里的时间指的是节流的间隔时间,只有当该时间过去后,函数才会被执行。

下面是一段节流的示例代码:

/**
 * 节流函数
 * @param {Function} func 需要执行的函数
 * @param {number} interval 最小间隔时间(单位:毫秒)
 * @returns {Function} 返回节流处理后的函数
 */
function throttle(func, interval) {
  let timer = null;
  let lastExecTime = 0;

  return function() {
    const context = this;
    const args = arguments;
    const elapsed = Date.now() - lastExecTime;

    if (elapsed < interval) {
      if (timer) clearTimeout(timer);
      timer = setTimeout(() => {
        lastExecTime = Date.now();
        func.apply(context, args);
      }, interval - elapsed);
    } else {
      lastExecTime = Date.now();
      func.apply(context, args);
    }
  }
}

/**
 * 使用示例
 */
function doSomething() {
  console.log('do something');
}

const throttledDoSomething = throttle(doSomething, 1000);

window.addEventListener('scroll', throttledDoSomething);

这段代码中,我们定义了一个 throttle 函数,将需要执行的函数和最小间隔时间作为参数。在函数内部,我们定义了一个 timer 变量,用于存放 setTimeout 返回的定时器 ID,以及一个 lastExecTime 变量,记录上次执行的时间。在执行函数时,我们首先保存当前执行上下文和参数,计算当前时间与上次执行时间的间隔,如果间隔还没达到最小间隔时间,则使用 setTimeout 创建一个定时器,在这个定时器超时时执行函数;如果间隔已经达到最小间隔时间,则直接执行函数,并更新 lastExecTime 的值。

在使用时,我们可以将需要执行的函数和节流时间间隔作为参数传入 throttle 函数,得到一个新的节流处理过的函数。在这里,我们给 window 对象的 scroll 事件监听函数传入了这个新的节流函数,以实现节流的效果。

防抖与节流的选择

防抖与节流都是解决事件触发频繁引起性能问题的优化手段,在不同的应用场景下可能会有不同的选择。

防抖的应用场景:

  • 按钮提交场景:防止多次提交按钮,只执行最后提交的一次
  • 搜索框场景:防止搜索连续触发,只在搜索结束后执行一次
  • 监听滚动事件:防止滚动连续触发,只在隔一段时间后执行一次

节流的应用场景:

  • 滚动加载场景:滚动时,不断加载数据,但是要控制两次请求之间的时间间隔,防止一次滚动中请求次数过多
  • 统计埋点场景:多次点击进行统计时,需要控制一段时间才能进行下一次统计

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 防抖debounce与节流thorttle - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • xml转json的js代码

    XML转JSON是开发过程中常见的问题,有时候需要将后端返回的XML数据转换为前端需要的JSON格式。以下是XML转JSON的JS代码的详细攻略: 一、XML转JSON的原理 XML和JSON是两种不同的数据格式,因此需要编写代码将XML转换为JSON格式。XML数据以标签为基础,有嵌套的结构关系,而JSON数据则以键值对为基础,没有嵌套的结构关系。因此,将…

    JavaScript 2023年5月27日
    00
  • 不唐突的JavaScript的七条准则整理收集

    针对“不唐突的JavaScript的七条准则整理收集”的完整攻略,我将按照以下步骤进行讲解: 简介 准则一:使用模块化编程 准则二:避免使用全局变量 准则三:显式声明变量类型 准则四:封装重用的代码 准则五:使用 API 和库 准则六:舍弃 eval() 函数 准则七:使用立即执行函数表达式 示例说明 总结 1. 简介 该攻略旨在探讨如何写出不唐突的 Jav…

    JavaScript 2023年5月18日
    00
  • js document.getElementsByClassName的使用介绍与自定义函数

    让我们来详细讲解一下 “document.getElementsByClassName” 的使用介绍与自定义函数的完整攻略。 1. document.getElementsByClassName() 的介绍 document.getElementsByClassName() 是一个 JavaScript 函数,用于获取页面上所有指定 class 属性的元素。…

    JavaScript 2023年6月10日
    00
  • TypeScript中使用getElementXXX()的示例代码

    下面是详细讲解“TypeScript中使用getElementXXX()的示例代码”的完整攻略: 1. 简介 在前端开发中,我们经常需要使用DOM元素进行页面操作。TypeScript是JavaScript的超集,因此在使用TypeScript时,我们也需要使用DOM元素。这时候,我们就需要使用getElementXXX()方法来获取DOM元素。 getEl…

    JavaScript 2023年6月10日
    00
  • js实现3D旋转相册

    以下是“JS实现3D旋转相册”的完整攻略。 简介 “JS实现3D旋转相册”是一种基于JavaScript实现的动态效果,可以将多张图片组合成一个3D旋转效果的相册,常用于网站设计、产品展示等场景。 实现步骤 创建HTML结构 首先,需要在HTML中创建相册所需的元素结构,如下所示: <div id="carousel"> &l…

    JavaScript 2023年6月10日
    00
  • 6种javascript显示当前系统时间代码

    以下是关于“6种JavaScript显示当前系统时间代码”的详细攻略。 概述 在网页中显示当前系统时间是一项常见的需求,JavaScript提供了多种方法来实现这个目标。本文将介绍6种不同的实现方法,并提供示例代码。 方法1: JavaScript Date对象 JavaScript Date对象是处理日期和时间的常用对象,可以获取当前日期和时间。下面是获取…

    JavaScript 2023年5月27日
    00
  • ES6变量赋值和基本数据类型详解

    ES6变量赋值和基本数据类型详解 ES6变量赋值 let 和 const 在ES6引入了两个新的关键字let和const来声明变量,与ES5中的var不同的是,let和const声明的变量具有块级作用域。 let用来声明可变的变量,可以在同一作用域中多次进行赋值操作: let a = 1; a = 2; const用来声明不可变的变量,只能在声明时赋值,一旦…

    JavaScript 2023年6月10日
    00
  • 详解操作cookie的原生方法cookieStore

    下面是详解操作cookie的原生方法cookieStore的完整攻略。 一、什么是cookieStore cookieStore 是浏览器 JavaScript 运行时的一个 API,用来管理浏览器中所有的 cookie,可用于对 cookie 实现增删改查等操作。 二、cookieStore的基本使用方法 cookieStore API 可以使用在浏览器中…

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