首页 > 其他分享 >防抖和节流有什么区别傻傻分不清??一文看懂

防抖和节流有什么区别傻傻分不清??一文看懂

时间:2024-12-10 11:30:55浏览次数:9  
标签:触发 防抖 节流 傻傻 timer 执行 函数

防抖和节流的区别

防抖(Debounce)和节流(Throttle)都是用于控制函数执行频率的技术,它们主要用于优化在浏览器中频繁触发的事件(如窗口大小调整、滚动、鼠标移动、按键按下等),但它们的工作方式有所不同。

防抖(Debounce)

  • 定义:防抖是指在事件被触发后,延迟一定时间后才执行回调函数,如果在这个延迟时间内事件又被触发,则重新计算延迟时间。简单来说,只有当经过一段规定的时间后没有再次触发这个事件,才会执行对应的函数。
  • 示例场景:
    • 搜索框的输入联想功能。当用户在搜索框中输入内容时,你可能希望在用户停止输入一段时间(例如 500 毫秒)后才发送请求获取联想建议。如果用户一直在输入,那么就不断重新计算延迟时间,直到用户停止输入达到规定的时间后才执行获取联想建议的函数。
    • 窗口大小调整时重新布局的功能。只有当用户停止调整窗口大小一段时间后,才重新计算布局,避免在调整过程中频繁地重新布局,浪费性能。
  • 代码示例(使用 JavaScript)
function debounce(func, delay) {
    let timer;
    return function() {
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            func.apply(this, arguments);
            timer = null;
        }, delay);
    };
}
// 假设这是一个需要防抖的函数,例如处理窗口大小调整后的布局更新
function handleResize() {
    console.log("窗口大小调整后的布局更新");
}
// 创建防抖后的函数
const debouncedHandleResize = debounce(handleResize, 300);
// 当窗口大小改变时调用防抖后的函数
window.addEventListener('resize', debouncedHandleResize);

在上述代码中,debounce函数返回一个新的函数。每次触发事件时(这里是windowresize事件),如果之前设置的定时器还存在,就清除它,然后重新设置新的定时器。只有当定时器计时结束(300 毫秒内没有再次触发resize事件),才会执行handleResize函数。

节流(Throttle)

  • 定义:节流是指在一定时间间隔内,不管事件触发多少次,只会执行一次函数。也就是说,函数的执行频率是固定的,按照一定的时间周期来执行。
  • 示例场景:
    • 滚动加载更多内容的功能。当用户滚动页面时,为了避免频繁地发送加载请求,可以设置一个节流函数,使得每间隔一段时间(例如 2 秒)才发送一次加载更多内容的请求,这样可以防止大量不必要的请求,同时也能保证用户在滚动过程中能够加载到新的内容。
    • 鼠标连续点击按钮触发某个操作,比如游戏中的射击按钮。为了避免玩家过快地连续点击导致游戏逻辑出现问题,可以设置节流,让射击操作按照一定的频率(如每秒射击一次)来执行。
  • 代码示例(使用 JavaScript)
function throttle(func, delay) {
    let timer = null;
    return function() {
        if (!timer) {
            func.apply(this, arguments);
            timer = setTimeout(() => {
                timer = null;
            }, delay);
        }
    };
}
// 假设这是一个需要节流的函数,例如滚动加载更多内容
function loadMore() {
    console.log("加载更多内容");
}
// 创建节流后的函数
const throttledLoadMore = throttle(loadMore, 2000);
// 当页面滚动时调用节流后的函数
window.addEventListener('scroll', throttledLoadMore);

在这个代码中,throttle函数返回的新函数在每次被调用时,首先检查是否已经有定时器在运行。如果没有定时器(意味着距离上次执行函数已经过去了规定的延迟时间),就执行loadMore函数,然后设置一个新的定时器。在定时器未结束(2000 毫秒内)再次触发事件时,函数不会执行,直到定时器结束,才可以再次执行。

总结区别

  • 执行次数:
    • 防抖:在事件停止触发后的延迟时间内只执行一次,如果事件一直触发,可能永远不会执行,直到事件停止触发一段时间后才会执行。
    • 节流:在固定的时间间隔内一定会执行一次,不管事件触发多么频繁。
  • 应用场景侧重点:
    • 防抖:更侧重于处理连续的事件触发,并且希望只在最后一次触发后的延迟时间后执行一次操作,例如用户输入完成后的操作或者窗口大小调整完成后的操作。
    • 节流:主要用于控制在一段时间内频繁触发的事件的执行频率,保证函数按照一定的节奏执行,例如滚动加载或者频繁的按钮点击操作。

标签:触发,防抖,节流,傻傻,timer,执行,函数
From: https://blog.csdn.net/qq_64946501/article/details/144369383

相关文章

  • 字节流读入,输出文件——java
    importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args)throwsException{OutputStreamout=newFileOutputStream("C:\\Users\\super\\Desktop\\test.txt.txt");Scannersc=newScanne......
  • Java面试要点42 - Java IO:字节流与字符流详解
    文章目录一、引言二、IO流的基本概念三、字节流体系四、字符流体系五、字节流与字符流的转换六、IO操作的最佳实践6.1资源管理和异常处理6.2性能优化策略6.3字符编码处理6.4现代文件操作API的使用6.5安全性考虑总结一、引言在Java编程中,IO(输入/输出)操作是一......
  • 分别写出防抖和节流的两个函数,并描述它们分别有什么运用场景?
    //防抖函数(Debounce)functiondebounce(func,delay){lettimer;returnfunction(){clearTimeout(timer);timer=setTimeout(()=>{func.apply(this,arguments);},delay);};}//节流函数(Throttle)functionthrottle(func,delay)......
  • SWJTU数电实验:按键防抖动设计
    本文还未验收,仅供参考,我看别人的更复杂一点,或许我的有问题。实验要求用VerilogHDL设计一个按键防抖动电路,要求用有限状态机实现。防抖动电路的输入接实验箱的按键/开关(SW0),输出接实验4计数器电路的时钟输入,实现每按一次按键(或拨一次开关)计数器加1,多......
  • JavaScript进阶--节流防抖以及技巧打磨
    打磨技巧深浅拷贝只针对引用类型浅拷贝拷贝的是值,但引用数据类型的值为地址方法:Object.assign(newobj,oldobj)Array.concat(newArr,oldArr)配合展开运算符...比较复制复制相当于把将要复制对象的地址,直接进行获取,而不是创建一个新的对象,赋予属性的值和名//实......
  • 【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • 防抖和节流(小白文)
    文章目录什么是防抖和节流?防抖(Debouncing)节流(Throttling)如何实现防抖和节流?防抖的实现节流的实现结语#防抖和节流:让你的网站跑得更快的小技巧大家好!今天我们来聊聊两个让网站跑得更快的小技巧:防抖和节流。这两个词听起来可能有点专业,别担心,我会用简单的比喻来解......
  • Java超详细知识点——I/O流(字节流和字符流)
    File类:JavaAPI:java.io.File类是用来操作文件或文件夹的,无法用来读写1.首先创建一下file的对象:里面可以写相对路径或者绝对路径Filefile=newFile("CCC.java");也可以使用其他构造方法//Stringpath="D:\\ch06";//StringfileName="1.txt";Filefile=new......
  • .NET Core中实现防抖
    利用分布式锁在ASP.NETCore中实现防抖 前言在 Web 应用开发过程中,防抖(Debounce) 是确保同一操作在短时间内不会被重复触发的一种有效手段。常见的场景包括防止用户在短时间内重复提交表单,或者避免多次点击按钮导致后台服务执行多次相同的操作。无论在单机环境中,还是在分......
  • 【高级编程】Java IO流(下)字符流 Reader Writer 字节流读取二进制文件
    文章目录ReaderFileReaderBufferedReaderWriterFileWriterBufferedWriter读写二进制文件ReaderReader是一个抽象类,用于读取字符流。它是所有字符输入流的基类。Reader提供了一些基本的方法来读取字符数据intread()//读取单个字符,并返回一个整数。如果到达流......