iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >JavaScript中节流和防抖的区别是什么
  • 724
分享到

JavaScript中节流和防抖的区别是什么

2024-04-02 19:04:59 724人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关javascript中节流和防抖的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。节流概念(Throttle)按照设定的时间固定

这期内容当中小编将会给大家带来有关javascript中节流和防抖的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

节流概念(Throttle)

按照设定的时间固定执行一次函数,比如200ms一次。注意:固定就是你在mousemove过程中,执行这个节流函数,它一定是200ms(你设定的定时器延迟时间)内执行一次。没到200ms,一定会返回,没有执行回调函数的。

主要应用场景有:scroll、touchmove

防抖概念(Debounce)

抖动停止后的时间超过设定的时间时执行一次函数。注意:这里的抖动停止表示你停止了触发这个函数,从这个时间点开始计算,当间隔时间等于你设定时间,才会执行里面的回调函数。如果你一直在触发这个函数并且两次触发间隔小于设定时间,则一定不会到回调函数那一步。 ·

主要应用场景有:input验证、搜索联想、resize

节流实现

思路: 第一次先设定一个变量true,第二次执行这个函数时,会判断变量是否true,是则返回。当第一次的定时器执行完函数最后会设定变量为flase。那么下次判断变量时则为flase,函数会依次运行。

代码一:首次不执行

function throttle(fn,delay=100){
    //首先设定一个变量,在没有执行我们的定时器时为null
    let timer = null;
    return function(){
        //当我们发现这个定时器存在时,则表示定时器已经在运行中,需要返回
        if(timer) return;
        timer = setTimeout(()=>{
            fn.apply(this,arguments);
            timer = null;
        },delay);
    }
}

代码二:首次执行

function throttle2(fn,delay=100){
    let last = 0;
    return function(){
        let curr = +new Date();
        if(curr - last > delay){
            fn.apply(this,arguments);
            last = curr;
        }
    }
}

防抖实现

思路:首次运行时把定时器赋值给一个变量,第二次执行时,如果间隔没超过定时器设定的时间则会清除掉定时器,重新设定定时器,依次反复,当我们停止下来时,没有执行清除定时器,超过一定时间后触发回调函数。

代码一:首次不执行

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

代码二:首次执行

function debounce2(fn, delay = 200, atBegin = true) {
    let timer = null, last = 0,during;
    return function () {
        let self = this, args = arguments;
        var exec = function () {
            fn.apply(self, args);
        }
        if (atBegin && !timer) {
            exec();
            atBegin = false;
        } else {
            during = Date.now() - last;
            if (during > delay) {
                exec();
            } else {
                if (timer) clearTimeout(timer);
                timer = setTimeout(function () {
                    exec();
                }, delay);
            }
        }
        last = Date.now();
    }
}

演示  打开控制台观察变化

上面的代码只是我自己的一个简单实现,看看lodash里面的两个核心实现代码。生产中建议使用它们的库,毕竟有这么多人在用,出bug的机会比较少,我上面的代码有可能有一些情况没考虑到。如果你发现有问题的,也请告诉我。

如果在项目中有需要用到的,可以直接安装单个的NPM模块。 throttle  和  debounce

lodash使用使用文档

lodash库里面这两个函数设置的参数有点复杂,记录一下里面的参数和代码使用。

节流(throttle)

官方文档解释:

创建一个节流函数,在 wait 秒内最多执行 func 一次的函数。 该函数提供一个 cancel 方法取消延迟的函数调用以及 flush 方法立即调用。 可以提供一个 options 对象决定如何调用 func 方法, options.leading 与|或 options.trailing 决定 wait 前后如何触发。 func 会传入最后一次传入的参数给这个函数。 随后调用的函数返回是最后一次 func 调用的结果。

注意: 如果 leading 和 trailing 都设定为 true 则 func 允许 trailing 方式调用的条件为: 在 wait 期间多次调用。

如果 wait 为 0 并且 leading 为 false, func调用将被推迟到下一个点,类似setTimeout为0的超时。

参数

func (Function)
要节流的函数
[wait=0] (number)
需要节流的毫秒
[options] (Object)
选项对象
[options.leading=true] (boolean)
指定调用在节流开始前
[options.trailing=true] (boolean)
指定调用在节流结束后

返回值 (Function)

返回节流的函数

示例

// 避免在滚动时过分的更新定位
Jquery(window).on('scroll', _.throttle(updatePosition, 100));
// 点击后就调用 `renewToken`,但5分钟内超过1次。
var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
jQuery(element).on('click', throttled);
// 取消一个 trailing 的节流调用
jQuery(window).on('popstate', throttled.cancel);

防抖(debounce)

创建一个 debounced(防抖动)函数,该函数会从上一次被调用后,延迟 wait 毫秒后调用 func 方法。 debounced(防抖动)函数提供一个 cancel 方法取消延迟的函数调用以及 flush 方法立即调用。 可以提供一个 options(选项) 对象决定如何调用 func 方法,options.leading 与 options.trailing 决定延迟前后如何触发(先调用后等待 还是 先等待后调用)。 func 调用时会传入最后一次提供给 debounced(防抖动)函数 的参数。 后续调用的 debounced(防抖动)函数返回是最后一次 func 调用的结果。

注意: 如果 leading 和 trailing 选项为 true, 则 func 允许 trailing 方式调用的条件为: 在 wait 期间多次调用防抖方法。

如果 wait 为 0 并且 leading 为 false, func调用将被推迟到下一个点,类似setTimeout为0的超时。

参数

<pre>//code from Http://caibaojian.com/throttle-debounce.html
`func (Function)
要防抖动的函数
[wait=0] (number)
需要延迟的毫秒数
[options] (Object)
选项对象
[options.leading=false] (boolean)
指定调用在延迟开始前
[options.maxWait] (number)
设置 func 允许被延迟的最大值
[options.trailing=true] (boolean)
指定调用在延迟结束后` </pre>

返回值 (Function)

返回具有防抖动功能的函数

示例

// 避免窗口在变动时出现昂贵的计算开销。
jQuery(window).on('resize', _.debounce(calculateLayout, 150));
// 当点击时 `sendMail` 随后就被调用。
jQuery(element).on('click', _.debounce(sendMail, 300, {
  'leading': true,
  'trailing': false
}));
// 确保 `batchLog` 调用1次之后,1秒内会被触发。
var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
var source = new EventSource('/stream');
jQuery(source).on('message', debounced);
// 取消一个 trailing 的防抖动调用
jQuery(window).on('popstate', debounced.cancel);

上述就是小编为大家分享的JavaScript中节流和防抖的区别是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网VUE频道。

--结束END--

本文标题: JavaScript中节流和防抖的区别是什么

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中节流和防抖的区别是什么
    这期内容当中小编将会给大家带来有关JavaScript中节流和防抖的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。节流概念(Throttle)按照设定的时间固定...
    99+
    2024-04-02
  • javascript的防抖和节流是什么
    这篇文章将为大家详细讲解有关javascript的防抖和节流是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:为什么需要防抖与节流 防抖和节流都是为了解决短时间内大量触发某函数或者事件而导...
    99+
    2023-06-28
  • JavaScript中防抖和节流的区别及适用场景是什么
    这篇文章主要介绍“JavaScript中防抖和节流的区别及适用场景是什么”,在日常操作中,相信很多人在JavaScript中防抖和节流的区别及适用场景是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jav...
    99+
    2023-06-30
  • JavaScript中防抖和节流的区别及适用场景
    目录前言防抖例如代码演示节流例如代码演示前言 防抖和节流,这个在我们的前端生涯中,这两个名词肯定不陌生,甚至经常被人问起: 两者有什么区别?分别用于什么场景? ps:这就是高频的面试...
    99+
    2024-04-02
  • 什么是JavaScript的防抖与节流
    目录一、函数防抖(debounce) 1. 什么是防抖? 二、函数节流 2.1 定时器实现 2.2 时间戳实现 2.3 时间戳+定时器 一、函数防抖(debounce) 1. 什么...
    99+
    2024-04-02
  • javascript函数的节流和防抖是什么意思
    本篇内容介绍了“javascript函数的节流和防抖是什么意思”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • JavaScript的防抖和节流案例
    目录防抖节流: 防抖:在一定的时间内只执行最后一次任务; 节流:一定的时间内只执行一次; 防抖 <button id="debounce">点我防抖!</bu...
    99+
    2024-04-02
  • 怎么理解javascript中防抖和节流
    本篇内容介绍了“怎么理解javascript中防抖和节流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 关于JavaScript防抖与节流的区别与实现
    目录1、防抖2、节流3、总结 前言: 作为前端开发中会以下两种需求 (1)搜索需求 搜索的逻辑就是监听用户输入事件,等用户输入完成之后把数据发送给后端,后端返回匹配数据,前端显示数...
    99+
    2024-04-02
  • JavaScript 防抖和节流详解
    目录防抖节流总结防抖 自动门感应到有人,打开门,并且开始5秒倒计时,在 5 s 内有另外一个人靠近到门,门感应到人,重新5秒倒计时 当事件被触发时,设定一个延迟,若期间事件又被触发...
    99+
    2024-04-02
  • JavaScript中防抖与节流指的是什么意思
    这篇文章主要为大家展示了“JavaScript中防抖与节流指的是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中防抖与节流指的是什么意思”这篇文章吧。一、函数防抖(d...
    99+
    2023-06-22
  • JavaScript的防抖和节流怎么实现
    这篇文章主要介绍了JavaScript的防抖和节流怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript的防抖和节流怎么实现文章都会有所收获,下面我们一起来看看吧。1. 前言首先来举个例子。...
    99+
    2023-06-29
  • javascript的防抖和节流你了解吗
    一:为什么需要防抖与节流  防抖和节流都是为了解决短时间内大量触发某函数或者事件而导致的性能问题,比如在 1.用户体验上,触发频率过高导致的响应速度跟不上触发频率,出现延迟...
    99+
    2024-04-02
  • 老生常谈Javascript的防抖和节流
    目录1. 什么是防抖2、什么是节流3、节流阀总结1. 什么是防抖 【解释】: 防抖策略(debounce)是当事件被触发后,延迟 n 秒后再执行回调,如果在这 n 秒内事件...
    99+
    2024-04-02
  • Javascript的防抖和节流方法怎么用
    本篇内容主要讲解“Javascript的防抖和节流方法怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript的防抖和节流方法怎么用”吧!1. 什么是防抖【解释】: 防...
    99+
    2023-06-29
  • JS中节流和防抖函数的实现及区别示例
    目录引言一、概念二、实现三、区别四、Lodash4-1.throttle4-2.debounce五、使用场景六、总结引言 在前端开发中,经常和DOM、BOM打交道,例如:窗口的res...
    99+
    2024-04-02
  • JS节流和防抖的区分和实现
    本篇内容主要讲解“JS节流和防抖的区分和实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS节流和防抖的区分和实现”吧!节流概念(Throttle)按照设定的...
    99+
    2024-04-02
  • JS怎么防抖和节流
    这篇文章主要讲解了“JS怎么防抖和节流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么防抖和节流”吧!函数防抖当持续触发事件时,一定时间段内没有再触发...
    99+
    2024-04-02
  • JavaScript中防抖和节流的实战应用记录
    目录前言为什么我们需要防抖/节流防抖节流总结前言 你可能会遇到这种的情况,一个站点使用自动填充的文本框,内容的拖拽,效果的滚动。那么,你遇到防抖和截流的概率还是很高的。为了使得这些操...
    99+
    2024-04-02
  • 详解Java中的防抖和节流
    目录概念防抖(debounce)节流(throttle)区别Java实现防抖(debounce)防抖测试1防抖测试2防抖测试简易版节流(throttle)节流测试1彩蛋解决方法1解决...
    99+
    2022-11-13
    Java防抖 Java 节流 Java 防抖 节流
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作