js防抖和节流 区别及实现方式

js防抖和节流 区别及实现方式概念 函数防抖 debounce 触发高频事件后 n 秒内函数只会执行一次 如果 n 秒内高频事件再次被触发 则重新计算时间 函数节流 throttle 高频事件触发 但在 n 秒内只会执行一次 所以节流会稀释函数的执行频率 函数节流 throttle 与函数防抖 debounce 都是为了限制函数的执行频次 以优化函数触发频率过高导致的响应速度跟不上触发频率 出现延迟 假死或卡顿的现

 

概念:

函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

函数节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

1、函数防抖(debounce)

  • 实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法
  • 缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟
//防抖debounce代码: function debounce(fn,delay) { var timeout = null; // 创建一个标记用来存放定时器的返回值 return function (e) { // 每当用户输入的时候把前一个 setTimeout clear 掉 clearTimeout(timeout); // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数 timeout = setTimeout(() => { fn.apply(this, arguments); }, delay); }; } // 处理函数 function handle() { console.log('防抖:', Math.random()); } //滚动事件 window.addEventListener('scroll', debounce(handle,500));

2、函数节流(throttle)

  • 实现方式:每次触发事件时,如果当前有等待执行的延时函数,则直接return
//节流throttle代码: function throttle(fn,delay) { let canRun = true; // 通过闭包保存一个标记 return function () { // 在函数开头判断标记是否为true,不为true则return if (!canRun) return; // 立即设置为false canRun = false; // 将外部传入的函数的执行放在setTimeout中 setTimeout(() => { // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。 // 当定时器没有执行的时候标记永远是false,在开头被return掉 fn.apply(this, arguments); canRun = true; }, delay); }; } function sayHi(e) { console.log('节流:', e.target.innerWidth, e.target.innerHeight); } window.addEventListener('resize', throttle(sayHi,500));

总结:
函数防抖:将多次操作合并为一次操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

函数节流:使得一定时间内只触发一次函数。原理是通过判断是否有延迟调用函数未执行。

区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

3、参考文献:

节流和防抖的区别,以及如何实现

函数节流与函数防抖

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199935.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:52
下一篇 2026年3月20日 上午11:53


相关推荐

  • 【结合实例】信息增益的计算

    【结合实例】信息增益的计算参考文章 https www cnblogs com qcloud1001 p 6735352 html 信息增益原理介绍介绍信息增益之前 首先需要介绍一下熵的概念 这是一个物理学概念 表示 一个系统的混乱程度 系统的不确定性越高 熵就越大 假设集合中的变量 X x1 x2 xn 它对应在集合的概率分别是 P p1 p2 pn 那么这个集合的熵表示为

    2026年3月19日
    2
  • linux卸载socat,socat在Linux下的使用「建议收藏」

    目录0x01socat介绍0x02socat进行文件传输0x03socat正向端口转发0x04socat反向端口转发注:边界机器Ubuntu192.168.222.177内网机器win7192.168.222.1370x01socat介绍socat我们在前面也已经介绍过了,之前说的是Windows下的利用,如果没有看到的朋友请移步【socat在Windows下的使用】,socat…

    2022年4月10日
    164
  • javascript中void(0);用法及常见问题解析

    javascript中void(0);用法及常见问题解析转载这篇文章使用过ajax的朋友经常会见到这样的代码:here,这里面的void是一个操作符,该操作符指定要计算一个表达式但是不返回值。javascript:void(0)在某些情况下会有浏览器不兼容的bug。下面我们先来看下javascript:void(0)的基础介绍及用法,然后再来看使用它会出现什么问题,该怎么解决。提示:在学习一下内容之前,你可以先通过javascript:vo…

    2022年7月18日
    16
  • Shell Step by Step (4) —— Cron & Echo「建议收藏」

    Shell Step by Step (4) —— Cron & Echo

    2022年2月7日
    48
  • java帝国时代_我的第一个java程序

    java帝国时代_我的第一个java程序1C语言帝国的统治现在是公元1995年,C语言帝国已经统治了我们20多年,实在是太久了。1972年,随着C语言的诞生和Unix的问世,帝国迅速建立统治,从北美到欧洲,从欧洲到亚洲,无数程序员臣服在他的脚下。帝国给我们提供了极好的福利:贴近硬件,运行极快,效率极高。使用这些福利,程序员们用C开发了很多系统级软件,操作系统,编译器,数据库,网络

    2026年3月2日
    5
  • pychargm2021.3.13永久激活教程 3月最新注册码[通俗易懂]

    pychargm2021.3.13永久激活教程 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号