JavaScript函数防抖与函数节流的定义及使用详解

JavaScript函数防抖与函数节流的定义及使用详解

函数防抖和函数节流是 JavaScript 常用的两种优化方案。它们可以延迟函数的执行,减少频繁请求和高频事件造成的性能问题。

一、函数防抖

在 JavaScript 中,如果频繁触发某个事件,比如输入框输入,鼠标滚动等,可能会造成函数频繁执行,影响性能。而使用函数防抖可以延迟函数的执行,只有等到一段时间内没有触发事件后才会执行函数。函数防抖的概念可以理解为:多次触发事件后,事件处理函数只执行一次,并且是在触发操作后一段时间(例如2秒)才执行,如果在这个时间内再次触发事件,则重新计算时间。

1. 函数防抖的基本实现

function debounce(fn, delay) {
  let timer = null;
  return function() {
    let args = arguments;
    let that = this;
    timer && clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(that, args);
    }, delay || 500);
  }
}

函数接受两个参数:要执行的函数和延迟时间。返回一个新的函数,这个函数利用了闭包的特性,保存了timer对象,保证了每次调用函数时都是同一个timer。接着调用 setTimeout 设置延时执行函数,如果在延时期间又执行了一次函数,则清空之前的计时器,重新开始计时。

2. 函数防抖的应用

例如,我们要监听一个输入框的变化,根据用户输入的内容进行搜索:

<input type="text" id="searchInput">
const searchInput = document.querySelector('#searchInput');

function search() {
  console.log(searchInput.value);
  // 进行搜索操作
}

searchInput.addEventListener('input', debounce(search, 500));

上面的代码中,我们给输入框添加了 input 事件监听器,并且使用 debounce 函数将 search 函数进行了防抖处理,延迟 500ms 执行搜索操作。

二、函数节流

函数防抖在某个时间段内只会执行一次函数,而函数节流会让函数按照一定的时间间隔执行。函数节流的概念可以理解为:高频触发事件,但在n秒内,只会执行一次函数。

1. 函数节流的基本实现

function throttle(fn, delay) {
  let timer = null;
  let lastTime = 0;
  return function() {
    let args = arguments;
    let that = this;
    let nowTime = new Date().getTime();
    if(nowTime - lastTime > delay || !lastTime) {
      timer && clearTimeout(timer);
      lastTime = nowTime;
      timer = setTimeout(function(){
        fn.apply(that, args);
      }, delay || 500);
    }
  }
}

函数节流的实现也是利用闭包保存了 timer 和 lastTime,在函数内部进行计算判断是否达到了时间间隔,在间隔达到时执行目标函数,否则不做任何操作。

2. 函数节流的应用

同样以监听输入框为例:

searchInput.addEventListener('input', throttle(search, 500));

使用 throttle 函数对 search 函数进行节流,每 500ms 执行搜索操作。

总结

函数防抖和函数节流可以有效地减少高频事件的触发次数,优化性能,提高用户体验。在实际开发中,我们需要根据场景进行选择合适的使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript函数防抖与函数节流的定义及使用详解 - Python技术站

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

相关文章

  • 每天一篇javascript学习小结(面向对象编程)

    关于“每天一篇javascript学习小结(面向对象编程)”的完整攻略,我来给你详细讲解一下。 攻略概述 在学习面向对象编程的过程中,我们需要掌握以下知识点: 对象的创建 原型和原型链 类和继承 ES6类的写法 在每天的学习小结中,我们需要围绕上述知识点展开学习,并且需要编写实际的代码来加深对于知识点的理解和掌握。 学习步骤 下面是一个比较详细的“每天一篇j…

    JavaScript 2023年5月27日
    00
  • jquery eval解析JSON中的注意点介绍

    jQuery eval解析JSON中的注意点介绍 在使用 jQuery 的 eval 方法来解析 JSON 数据时,需要注意一些细节,这些细节将直接影响到解析过程的准确性和效率。本文将介绍这些注意点,并使用示例进行说明。 什么是 jQuery eval 方法 在 jQuery 中,eval 方法被用于将 JSON 数据解析为 JavaScript 对象。ev…

    JavaScript 2023年5月27日
    00
  • JS数组交集、并集、差集的示例代码

    下面我将介绍JS数组交集、并集、差集的示例代码,让大家有更深入的理解。 JS数组交集 数组交集指的是两个或两个以上数组中共同的元素。下面是一个示例代码: const arr1 = [1, 2, 3, 4, 5]; const arr2 = [3, 4, 5, 6, 7]; const arr3 = [4, 5, 6, 7, 8]; const interse…

    JavaScript 2023年5月27日
    00
  • JavaScript中关于数组的调用方式

    JavaScript中的数组是一组值的有序集合,可以通过数字索引来访问这些值。在JavaScript中,数组可以通过几种不同的方式来创建和访问。 创建数组 JavaScript中的数组可以通过以下两种方式来创建: 直接使用方括号[]来创建一个空数组,如下所示: const arr1 = []; 使用方括号[]并在其中包含数组元素,如下所示: const ar…

    JavaScript 2023年5月27日
    00
  • javascript实现在网页中运行本地程序的方法

    实现在网页中运行本地程序的方法可以使用Javascript中的node-webkit模块。下面将详细介绍node-webkit的使用方法: 安装node-webkit模块 在安装node-webkit之前,需要安装Node.js环境。安装Node.js后即可使用npm命令安装node-webkit模块。在命令行中执行以下命令: npm install nw …

    JavaScript 2023年5月27日
    00
  • 使用BootStrapValidator完成前端输入验证

    使用 BootStrapValidator 完成前端输入验证的完整攻略如下: 步骤一:引入 BootStrap 和 BootStrapValidator 库 首先,需要引入 BootStrap 和 BootStrapValidator 两个库: <!– BootStrap CSS文件 –> <link rel="stylesh…

    JavaScript 2023年6月10日
    00
  • JS面试之对事件循环的理解

    JS面试之对事件循环的理解 事件循环是 JavaScript 事件模型的核心,对于理解 JavaScript 的异步编程至关重要。事实上,事件循环是 JavaScript 成功的关键之一。 什么是事件循环? JavaScript 是一种单线程编程语言。它有且只有一个主线程,因此只能同时执行一个任务。 事件循环是 JavaScript 异步编程的解决方案之一,…

    JavaScript 2023年5月28日
    00
  • js常用自定义公共函数汇总

    JS常用自定义公共函数是指在JS开发中常用的、可多次使用的函数,初学者建议掌握,提高开发效率。 常用自定义公共函数 1. 获取URL查询参数 在开发中,获取URL中的查询参数是很常见的需求。以下是一个获取URL中查询参数的函数: function getQueryString(name) { var reg = new RegExp("(^|&am…

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