返回顶部
首页 > 资讯 > 前端开发 > JavaScript >js防抖-节流函数的基本实现和补充详解
  • 419
分享到

js防抖-节流函数的基本实现和补充详解

js防抖js节流 2023-01-08 12:01:29 419人浏览 独家记忆
摘要

目录前言防抖函数概念和应用场景手写实现防抖函数节流函数概念和应用场景手写实现节流函数前言 防抖和节流函数是我们在平常开发的时候,比较常用的两个工具函数,使用防抖和节流函数可以提高我们

前言

防抖和节流函数是我们在平常开发的时候,比较常用的两个工具函数,使用防抖和节流函数可以提高我们的效率,减小事件触发的频率,可以起到降低服务器压力的作用。并且在面试时候,这两个函数也是会经常会被问到,因此,了解防抖和节流函数的基本原理和应用场景,并且手写实现这两个函数至关重要

防抖函数

概念和应用场景

防抖函数:当事件触发的时候,并不会立刻执行,而是会等待一段事件,当事件密集触发时候,函数的触发会频繁的被推迟,只有等待了一段时间也没有事件触发,才会真正的执行。如下图所示:

防抖的应用场景很多:

  • 输入框中频繁的输入内容,搜索或者提交信息;
  • 频繁的点击按钮,触发某个事件;
  • 监听浏览器滚动事件,完成某些特定操作;
  • 用户缩放浏览器的resize事件

案例:

在某个搜索框中输入自己想要搜索的内容:

比如想要搜索一个MacBook:
当我输入m时,为了更好的用户体验,通常会出现对应的联想内容,这些联想内容通常是保存在服务器的,所以需要一次网络请求;当继续输入ma时,再次发送网络请求;
那么macbook一共需要发送7次网络请求; 这大大损耗我们整个系统的性能,无论是前端的事件处理,还是对于服务器的压力;

但是我们需要这么多次的网络请求吗?

不需要,正确的做法应该是在合适的情况下再发送网络请求; 比如如果用户快速的输入一个macbook,那么只是发送一次网络请求;
比如如果用户是输入一个m想了一会儿,这个时候m确实应该发送一次网络请求;
也就是我们应该监听用户在某个时间,比如500ms内,没有再次触发时间时,再发送网络请求;
这就是防抖的操作:只有在某个时间内,没有再次触发某个函数时,才真正的调用这个函数;

手写实现防抖函数

那么如何通过代码实现防抖的功能呢?

首先,防抖函数应该传入一个需要实现防抖的函数,还有一个时间,该时间表示在规定时间内,如果再次触发此次事件,则取消上次事件。返回的结果应该是一个执行了此功能的函数。

那么整体的框架如下,只需要在_debounce函数里面实现功能即可。

function debounce(fn,delay){
	const _debounce = function(){
	}
	return _debounce
}

函数的参数传进来一个时间,该时间表示在规定时间内,如果再次触发此次事件,则取消上次事件,所以需要有定时器来记录时间。并且有取消事件的过程,所以我们需要在满足条件时候,取消定时器,即clearTimeout,那么还有个问题,fn函数this指向。

如果在_debounce中单独调用传进来的函数fn,即以fn()形式直接调用,那么fn是属于独立的函数调用,this指向的是window,实际this指向的是调用函数的对象,所以会出现错误。

我们知道事件调用的时候,响应函数参数会传进来一个event事件对象,所以我们要对这个参数(event事件对象)做处理。

那么:

timer定义一个定时器,保存上一次的定时器,在_debounce函数里面,如果timer不为空,那么先清除上一次的定时器,之后再给timer赋值,让他延迟执行fn函数,fn函数用apply改变了this指向,在setTimeout内部使用的是箭头函数,由于箭头函数内部没有this,所以会去上层找this,那么这个this实际上就是调用debounce的对象。

比如输入框的输入事件做防抖处理:

const inputEl = document.querySelector(“input”)
inputChange是输入事件触发后所要执行的函数,可以给他做防抖处理:const debounceChange = debounce(inputChange,3000),然后执行: inputEl.oninput = debounceChange,如果不加防抖处理,毫无疑问,每次在输入框输入时候,都会触发事件,加了防抖处理后,3秒内多次调用,下一次事件会把上一次事件清除掉。

这里的this通过apply调用后,指向的就是inputEl这个元素,

function debounce(fn, delay) {
  // 1.定义一个定时器, 保存上一次的定时器
  let timer = null

  // 2.真正执行的函数
  const _debounce = function(...args) {
    // 取消上一次的定时器
    if (timer) clearTimeout(timer)
    // 延迟执行
    timer = setTimeout(() => {
      // 外部传入的真正要执行的函数
      fn.apply(this, args)
    }, delay)
  }

  return _debounce
}

节流函数

概念和应用场景

节流函数:当事件执行时候,会执行这个事件的响应函数;如果这个事件会被频繁触发,那么节流函数会按照一定的频率来执行函数;不管在这个中间有多少次触发这个事件,执行函数的频繁总是固定的;如图所示:

节流的应用场景:

  • 监听页面的滚动事件;
  • 鼠标移动事件;
  • 用户频繁点击按钮操作;
  • 游戏中的一些设计

节流的具体应用场景:
很多人都玩过类似于飞机大战的游戏

在飞机大战的游戏中,我们按下空格会发射一个子弹:

很多飞机大战的游戏中会有这样的设定,即使按下的频率非常快,子弹也会保持一定的频率来发射;

比如1秒钟只能发射一次,即使用户在这1秒钟按下了10次,子弹会保持发射一颗的频率来发射;

但是事件是触发了10次的,响应的函数只触发了一次

手写实现节流函数

那么如何通过代码实现防抖的功能呢?

首先,我们需要两个变量记录当前事件触发的时间和上一次的开始时间,函数的参数会传进来间隔的时间,由此我们可以计算出下次触发的最低间隔时间,即为间隔时间-(当前事件触发的时间-上次的开始时间),如果间隔时间<=0,那么执行fn函数,并且修改上一次的开始时间为当前事件触发时间。

function throttle(fn, interval) {
  // 1.记录上一次的开始时间
  let lastTime = 0

  // 2.事件触发时, 真正执行的函数
  const _throttle = function(...args) {

    // 2.1.获取当前事件触发时的时间
    const nowTime = new Date().getTime()

    // 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数
    const remainTime = interval - (nowTime - lastTime)
    if (remainTime <= 0) {
      // 2.3.真正触发函数
      fn.apply(this,args)
      // 2.4.保留上次触发的时间
      lastTime = nowTime
    }
  }

  return _throttle
}

到此这篇关于js防抖-节流函数的基本实现和补充详解的文章就介绍到这了,更多相关js防抖节流函数的实现内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: js防抖-节流函数的基本实现和补充详解

本文链接: https://lsjlt.com/news/177080.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • js防抖-节流函数的基本实现和补充详解
    目录前言防抖函数概念和应用场景手写实现防抖函数节流函数概念和应用场景手写实现节流函数前言 防抖和节流函数是我们在平常开发的时候,比较常用的两个工具函数,使用防抖和节流函数可以提高我们...
    99+
    2023-01-08
    js防抖 js节流
  • JS函数节流和函数防抖实例介绍
    这篇文章主要介绍“JS函数节流和函数防抖实例介绍”,在日常操作中,相信很多人在JS函数节流和函数防抖实例介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS函数节流和函数防...
    99+
    2024-04-02
  • 如何理解JS函数防抖和函数节流
    目录概述1. 函数防抖(debounce)2. 函数节流(throttle)概述 函数防抖和函数节流都是定义一个函数,该函数接收一个函数作为参数,并返回一个添加了防抖或节流功能后的函...
    99+
    2024-04-02
  • js如何实现防抖和节流
    这篇文章给大家分享的是有关js如何实现防抖和节流的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。防抖 & 节流防抖和节流属于高阶技巧,业务中比较多见的场合也就是搜索内容改变提示信息。即使不加也也不一定能看出...
    99+
    2023-06-27
  • JS节流和防抖的区分和实现
    本篇内容主要讲解“JS节流和防抖的区分和实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS节流和防抖的区分和实现”吧!节流概念(Throttle)按照设定的...
    99+
    2024-04-02
  • JS函数防抖和函数节流的示例分析
    这篇文章主要介绍JS函数防抖和函数节流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述函数防抖和函数节流都是定义一个函数,该函数接收一个函数作为参数,并返回一个添加了防抖或节流功能后的函数。因此可以将函数...
    99+
    2023-06-15
  • 如何分析JS函数的防抖和节流
    如何分析JS函数的防抖和节流,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。节流实质上是:如果你持续触发事件,每隔一段时间,只执行一次事件。根据这个需求我们可以通...
    99+
    2023-06-03
  • JS中节流和防抖怎么实现
    本篇内容主要讲解“JS中节流和防抖怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS中节流和防抖怎么实现”吧!引言在前端开发中,经常和DOM、BOM打交道,例如:窗口的resize、sc...
    99+
    2023-07-02
  • JS中节流和防抖函数的实现及区别示例
    目录引言一、概念二、实现三、区别四、Lodash4-1.throttle4-2.debounce五、使用场景六、总结引言 在前端开发中,经常和DOM、BOM打交道,例如:窗口的res...
    99+
    2024-04-02
  • JS防抖节流函数的实现与使用场景
    目录一、什么是函数防抖 1、为什么需要函数防抖? 2、函数防抖的要点3、函数防抖的实现 4、函数防抖的使用场景 二、什么是函数节流 1、函数节流的要点 2、函数节流的实现3、函数节流...
    99+
    2024-04-02
  • JS防抖节流函数的实现与使用方式
    本篇内容介绍了“JS防抖节流函数的实现与使用方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一、什么是函数防抖为什么需要函数防抖?函数...
    99+
    2023-06-20
  • JavaScript中函数的防抖与节流详解
    目录一、函数的节流1.1 定义1.2 解决方法1.3 案例演示1.3 .1  代码演示1.3 .2  运行结果1.3 .3  添加函数节流操作1.3 ....
    99+
    2024-04-02
  • Vue手写防抖和节流函数代码详解
    目录1. 手写防抖debounce2. 手写节流throttle1. 手写防抖debounce 首先介绍一个防抖的应用场景。假如需要监听一个输入框在输入文字后触发的change事件,...
    99+
    2023-02-25
    Vue防抖和节流 Vue防抖 Vue节流
  • javascript的防抖节流函数解析
    目录防抖节流函数的解析认识防抖和节流函数认识防抖debounce函数防抖函数的案例认识节流throttle函数节流函数的应用场景自定义防抖和节流函数总结防抖节流函数的解析 认识防抖和...
    99+
    2024-04-02
  • 详解Java中的防抖和节流
    目录概念防抖(debounce)节流(throttle)区别Java实现防抖(debounce)防抖测试1防抖测试2防抖测试简易版节流(throttle)节流测试1彩蛋解决方法1解决...
    99+
    2022-11-13
    Java防抖 Java 节流 Java 防抖 节流
  • js中函数节流与防抖的示例分析
    小编给大家分享一下js中函数节流与防抖的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!js 的节流与防抖函数防抖&nbs...
    99+
    2024-04-02
  • JavaScript的防抖和节流怎么实现
    这篇文章主要介绍了JavaScript的防抖和节流怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript的防抖和节流怎么实现文章都会有所收获,下面我们一起来看看吧。1. 前言首先来举个例子。...
    99+
    2023-06-29
  • 解读函数的节流与防抖问题
    目录函数的节流与防抖1、节流2、防抖函数防抖和函数节流及其使用场景1、为什么会使用到函数防抖和函数节流2、什么是函数防抖和函数节流总结函数的节流与防抖 1、节流 节流的意思是,规定时...
    99+
    2022-12-09
    函数的节流 函数的防抖 函数节流与防抖
  • JavaScript函数防抖与函数节流的定义及使用详解
    目录一、函数防抖(Debouncing)1、基本概念2、算法思想3、代码实现4、使用场景二、函数节流(Throlle)1、基本概念2、算法思想3、代码实现4、使用场景一、函数防抖(D...
    99+
    2022-11-13
    JavaScript函数防抖 JavaScript函数节流 JavaScript 函数防抖 节流
  • JS前端同源策略和跨域及防抖节流详解
    目录引言jQuery中JSONP的实现防抖【重要】缓存搜索的列表1 定义全局缓存对象2:将搜索结果存储到缓存对象中3优先从缓存中获取搜索列表节流【重点】防抖和节流的区别引言 协议,域...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作