javascript函数的节流[throttle]与防抖[debounce]

JavaScript函数的节流与防抖

javascript开发中,有时候我们需要在频繁触发某些事件时,进行性能优化,防止事件处理函数被频繁调用而导致页面出现性能问题,这时,javascript的节流和防抖技术就能派上用场了。

什么是节流

节流(throttle)是一种控制事件触发频率的技术,它会将一定时间内发生的多次事件,限制成只触发一次事件。

具体来说,throttle会设置一个时间间隔threshold,在该时间间隔内,如果事件被重复触发,throttle会忽略多余的事件触发。只有当该时间间隔threshold到达之后,才会触发一次已忽略的事件,并重置定时器。

下面是一个基于定时器实现的节流函数示例代码:

function throttle(fn, interval) {
  let timer = null;
  return function (...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
      }, interval);
    }
  };
}

上述代码中的throttle函数,接受两个参数:一个是事件处理函数(fn),另一个是时间间隔(interval)。当事件被触发时,throttle将fn函数包装成一个闭包,然后利用setTimeout函数来延迟事件处理函数的执行,达到节流的目的。

什么是防抖

防抖(debounce)是一种控制事件触发频率的技术,它会将多次事件的执行合并成一次事件,并在一定时间后执行一次。

具体来说,debounce会设置一个时间间隔threshold,在该时间间隔内,如果事件被重复触发,debounce会忽略之前的事件触发,并在时间间隔到达后,才会执行一次已经合并的事件。

下面是一个基于定时器实现的防抖函数示例代码:

function debounce(fn, interval) {
  let timer = null;
  return function (...args) {
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }
    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, interval);
  };
}

上述代码中的debounce函数,接受两个参数:一个是事件处理函数(fn),另一个是时间间隔(interval)。当事件被触发时,debounce会清除之前的定时器,并重新设置一个新的定时器。在给定的时间间隔(interval)内,如果事件持续触发,则会重新设置定时器。当时间间隔到达后,会执行fn函数。

节流和防抖的应用场景

  • 节流时间间隔太短,适用于一些比较频繁的操作,比如实时搜索
  • 防抖时间间隔太短,适用于一些不太频繁的操作,比如表单验证

以下分别是一个简单的处理鼠标移动事件的节流和防抖示例:

节流示例

// 实时显示鼠标移动的坐标
const displayPositionThrottle = throttle((e) => {
  console.log(e.clientX, e.clientY);
}, 1000);

document.addEventListener('mousemove', displayPositionThrottle);

上述代码会持续监测鼠标移动事件,但只会在1秒内执行一次事件处理,避免了频繁改动DOM造成的页面性能问题。

防抖示例

// 点击按钮提交表单
const button = document.querySelector('button');
const submitFormDebounce = debounce(() => {
  console.log('提交表单');
}, 1000);

button.addEventListener('click', submitFormDebounce);

上述代码会在点击按钮时执行表单提交的操作,但如果一直频繁点击按钮,则不会一直发起表单提交操作,而是在1秒后执行一次提交表单操作,避免了因频繁点击按钮而造成的表单重复提交问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript函数的节流[throttle]与防抖[debounce] - Python技术站

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

相关文章

  • 用javascript实现画图效果的代码

    下面是用JavaScript实现画图效果的代码攻略: 1. 准备工作 在开始写代码之前,需要确认一些准备工作: 在HTML文件中添加一个画板的容器元素,可以是<canvas>标签或者其他类型的块级元素。 在HTML文件中引入JavaScript文件。 为画板添加事件监听器,例如mousedown、mousemove、mouseup等事件。 2. …

    JavaScript 2023年6月11日
    00
  • Document对象内容集合(比较全)

    对于网站开发者而言,了解Document对象内容集合是相当重要的。这个集合包含了许多的内容,例如文档信息、头部信息、body信息、表单信息、链接信息、脚本等等,下面详细讲解一下。 一、Document信息(document信息集合) Document信息集合提供了一堆有关于文档的重要信息,其中包括文档的标题、URL、网页DOM、脚本代码、cookie、use…

    JavaScript 2023年6月11日
    00
  • 注册或者点击按钮时,怎么防止用户重复提交数据(实例讲解)

    防止用户重复提交数据是一个重要的问题,避免重复提交数据可能会对网站的稳定性和性能产生负面影响。以下是一些防止用户重复提交数据的技术: 1. 前端防重复提交 前端防重复提交可以通过禁用按钮、显示加载样式、使用“单击一次”技术、请求限制等技术实现。下面是一个使用禁用按钮的示例: <button type="submit" id=&quo…

    JavaScript 2023年6月10日
    00
  • JavaScript中的事件循环机制及其运行原理

    JavaScript中的事件循环机制及其运行原理 JavaScript是一种单线程语言,这意味着一次只能执行一个任务。但是,JavaScript中有许多异步操作(例如网络请求、定时器等)需要在后台执行而不会阻塞代码运行,这就是事件循环机制的作用。 事件循环机制的基本概念 事件循环是JavaScript的一个重要特性,它基于一个简单的原理:执行栈为空时,Jav…

    JavaScript 2023年6月11日
    00
  • JavaScript 浏览器对象模型BOM使用介绍

    一、JavaScript 浏览器对象模型BOM使用介绍 JavaScript 浏览器对象模型(BOM)是 JavaScript 与浏览器的交互方式,它提供了一组对象,用于操作浏览器窗口。BOM 中的对象可以使你控制浏览器的行为,比如窗口大小、前进后退、弹出新窗口等。 BOM 包含了许多对象,其中最主要的是 window 对象,它表示浏览器的一个实例,它使我们…

    JavaScript 2023年6月11日
    00
  • JavaScript类型检测之typeof 和 instanceof 的缺陷与优化

    JavaScript类型检测之typeof 和 instanceof 的缺陷与优化 typeof的缺陷 在JavaScript中,typeof操作符用于检测一个变量或表达式的数据类型,返回一个字符串常量。 typeof variable typeof操作符返回的结果只有一下几种: “undefined”: 如果变量没有被赋值或者值为undefined “bo…

    JavaScript 2023年6月10日
    00
  • 处理JavaScript值为undefined的7个小技巧

    处理 JavaScript 值为 undefined 的 7 个小技巧 如果你在 JavaScript 开发中遇到了 undefined 值,可以考虑以下七个小技巧来解决。 1. 使用条件语句检测 undefined 值 使用 if 语句检测 JavaScript 的一个数据是否为 undefined 可以避免发生未定义(undefined)错误。 let …

    JavaScript 2023年6月10日
    00
  • js实现3D粒子酷炫动态旋转特效

    实现3D粒子酷炫动态旋转特效,需要以下几个步骤: 1.创建canvas画布和粒子对象数组;2.为粒子对象添加随机坐标、颜色以及速度;3.绘制粒子,并实现动态旋转效果;4.根据屏幕大小更新粒子位置。 下面,我将详细解释每个步骤并且提供具体的代码示例。 创建canvas画布和粒子对象数组。 首先,我们需要创建一个HTML文件,添加一张背景图片,然后再创建一个ca…

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