JavaScript的防抖和节流一起来了解下

JavaScript的防抖和节流一起来了解下

概念介绍

防抖和节流都是为了减少某些高频率事件的触发次数。在JavaScript中常用于优化性能或者提升用户体验。

防抖(debounce)指的是一段时间内重复触发同一事件,只执行一次函数的方法。可以使用定时器实现,如下代码所示:

function debounce(fn, delay) {
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  };
}

该防抖函数接受两个参数,第一个为要执行的函数,第二个为等待时间。在等待时间内,若重复触发,只有最后一次会被执行。

节流(throttle)指的是一段时间内执行多次的函数,在一段时间内,只会执行一次。可以通过判断两次执行时间间隔是否超过规定时间来实现,如下代码所示:

function throttle(fn, delay) {
  let timer = null;
  let flag = true;
  return function() {
    const context = this;
    const args = arguments;
    if (flag) {
      flag = false;
      fn.apply(context, args);
      setTimeout(function() {
        flag = true;
      }, delay);
    }
  };
}

该节流函数接受两个参数,第一个为要执行的函数,第二个为等待时间。在等待时间内,多次触发只有第一次会被执行。等待时间结束后,才能执行下一次。

示例说明

防抖用例

比如,我们有一个搜索输入框,用户每输入一个字符就会进行一次搜索,但有可能用户输入速度过快,频繁触发搜索,造成服务器负担过大。可以通过防抖来减少触发次数,从而减轻服务器负担。

const input = document.getElementById("search-input");
input.addEventListener(
  "input",
  debounce(function() {
    // 请求搜索接口
  }, 300)
);

在搜索输入框的input事件上使用防抖,设置300毫秒等待时间,用户输入速度在这个时间内,若进行多次搜索请求,只有最后一次请求会被执行。可以有效减少不必要的请求,减轻服务器负担。

节流用例

比如,我们有一个页面滚动监听事件,通过监听滚动条的滚动高度,实现动态效果,但是由于滚动条滚动过快,频繁触发事件,导致浏览器的运行效率受到影响,甚至会出现页面卡死的情况。可以通过节流来减少事件触发次数,优化性能。

window.addEventListener(
  "scroll",
  throttle(function() {
    // 重绘页面元素
  }, 300)
);

在滚动条监听事件上使用节流函数,设置300毫秒等待时间,每300毫秒重新触发一次事件,可以减轻浏览器运行负担,提高页面运行效率。

总结

防抖和节流都是优化JavaScript的常用技术,通过设置等待时间来控制函数执行频率,提高代码性能或者提升用户体验。具体情况下,使用哪一种技术取决于业务需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript的防抖和节流一起来了解下 - Python技术站

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

相关文章

  • 第一个JavaScript程序

    1. 创建 HTML 文件 首先,我们需要为我们的 JavaScript 文件创建一个 HTML 文件。在你的代码编辑器中,创建一个新文件并将其保存为 index.html。然后输入以下代码: <!DOCTYPE html> <html> <head> <title>My First JavaScript Pr…

    Web开发基础 2023年3月30日
    00
  • js实现简单的购物车有图有代码

    让我来为大家详细讲解一下如何用js实现简单的购物车吧。 1. 确定数据结构 在开始实现购物车之前,我们需要先确定其数据结构。在此,我们可以采用一个数组来储存购物车中的商品信息,其中每个元素都是一个对象,包含商品的相关信息:名称、价格、数量等,示例代码如下: let cart = [ { name: "商品1", price: 10, qu…

    JavaScript 2023年6月11日
    00
  • AngularJs E2E Testing 详解

    AngularJs E2E Testing 详解 在开发应用程序的过程中,我们需要确保这些程序在部署后正常运行。为了验证这些应用程序的功能,我们需要进行端到端 (End to End, E2E) 测试。 E2E 测试是一个自动化的过程,通过验证应用程序的模拟场景来模仿真实用户的行为。通过这种方式我们可以测试到所有层级,包括用户界面、功能、维护性、性能等。An…

    JavaScript 2023年6月10日
    00
  • javascript如何实现create方法

    当我们在 JavaScript 中使用面向对象编程时,有时需要创建一个对象模板,并基于该模板创建许多对象实例。JavaScript 的原型继承机制允许我们通过创建一个构造函数模板并向其原型对象添加方法和属性来实现这一目的。在这个过程中,我们可以使用 JavaScript 中的 create 方法,其允许我们基于一个现有对象创建一个新对象。 下面是使用 cre…

    JavaScript 2023年5月27日
    00
  • Javascript Array prototype 属性

    以下是关于JavaScript Array prototype属性的完整攻略。 JavaScript Array prototype属性 JavaScript Array prototype属性是所有数组对象的原型对象。该属性包含了所有数组对象可以访问的方法和属性。我们可以通过修改Array.prototype来扩展数组对象的功能。 下面是一个使用Array…

    JavaScript 2023年5月11日
    00
  • javascript self对象使用详解

    JavaScript Self对象使用详解 什么是Self对象? Self对象指的是JavaScript中的this关键字,它代表当前对象。可以在对象的方法中使用this关键字来引用当前对象,或者用在一个方法中引用其他方法。 如何使用Self对象? 在对象方法中使用Self对象 在JavaScript的对象方法中使用this关键字可以引用到当前的对象。如下例…

    JavaScript 2023年5月27日
    00
  • 解析ajaxFileUpload 异步上传文件简单使用

    解析ajaxFileUpload 异步上传文件简单使用攻略 异步上传文件简介 在传统的表单提交中,如果需要上传文件,则需要重新加载整个页面,用户体验并不好,而且上传大文件还会影响页面的响应速度。而异步上传则是采用ajax技术,实现上传文件的同时不刷新整个页面,从而提升用户体验。 ajaxFileUpload 简介 在实现异步上传功能的过程中,ajaxFile…

    JavaScript 2023年6月11日
    00
  • js根据json数据中的某一个属性来给数据分组的方法

    实现 JS 根据 JSON 数据中的某一个属性来给数据分组的方法,可以使用 Array.prototype.reduce() 方法和 object[key] 或 Object.assign() 来处理分组数据。 以下是具体步骤: 首先,使用 Array.prototype.reduce() 方法来遍历 JSON 数据,并将其分组为一个对象。 在 reduce…

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