浅聊函数防抖与节流

简介: 面试常考 防抖与节流

Description

防抖(debounce)

所谓防抖,就是指触发事件后 n 秒后才执行函数,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

防抖类型分为

  1. 非立即执行版
  2. 立即执行版
  3. 合成版本 防抖

防抖应用场景

  • 登录、发短信等按钮避免用户点击太快,以致于发送了多次请求
  • 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位
  • 文本编辑器实时保存,当无任何更改操作一秒后进行保存

非立即执行版

非立即执行版的意思是触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
/**
 * @description: 
 * @param {*} func 触发的事件
 * @param {*} wait 多少时长才执行事件
 * @return {*}
 */
        function debounce(func, wait) {
            let timeout;
            return function(){
                // 获取当前作用域和参数
                const context = this;
                const args = [...arguments] 
                // 如果当前timeout 存在
                // 清空定时器,再次等待wait时间过后再次执行事件
                if(timeout) clearTimeout(timeout)
                // 定时执行 传递进来的事件
                timeout = setTimeout(()=>{
                    func.apply(context,args)
                },wait)  
            }
        }

立即执行版本

立即执行版的意思是触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数的效果。
function debounce(func,wait) {
  let timeout;
  return function () {
      const context = this;
      const args = [...arguments];
      if (timeout) clearTimeout(timeout);
      const callNow = !timeout;
      timeout = setTimeout(() => {
          timeout = null;
      }, wait)
      if (callNow) func.apply(context, args)
  }
}
代码解析

当 执行 debounce 函数时, 第一次进来时,timeout 为false,所以 callNow 的值 为 true ,那么它会立即执行 func 函数,这时 timeout 的值 为 true , 当 timeout 值为true 时, 会执行 清空定时器,此时 timeout 又为 false 了 , 这时 callNow 又 为 true ,再次执行 func 函数。

一直循环这样的操作:

timeout false 时,会立刻执行 func 函数。

timeout true 时,它会执行 clearTimeOut ,这时timeout 又为 false, 而 callNow = ! timeout , 就会立刻执行 func 函数了。

合成版本 防抖

通过传递 Boolean 来决定执行哪种版本。

  • true 为立即执行版
  • false 为非立即执行版本

debounce(func,1000,true)

/**
 * @desc 函数防抖
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param immediate true 表立即执行,false 表非立即执行
 */
function debounce(func, wait, immediate) {
  let timeout;
  return function () {
    const context = this;
    const args = [...arguments];
    if (timeout) clearTimeout(timeout);
    if (immediate) {
      const callNow = !timeout;
      timeout = setTimeout(() => {
        timeout = null;
      }, wait)
      if (callNow) func.apply(context, args)
    }
    else {
      timeout = setTimeout(() => {
        func.apply(context, args)
      }, wait);
    }
  }
}

节流

所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。 节流会稀释函数的执行频率。

节流有两种实现:

  1. 时间戳版本
  2. 定时器版本

节流应用场景

  1. scroll 事件,每隔一秒计算一次位置信息等
  2. 浏览器播放事件,每个一秒计算一次进度信息等
  3. input 输入框在搜索内容时,可以控制多少s 在执行请求,避免多次发起请求,节约性能。

时间戳版本

function throttle(func, wait) {
    var previous = 0;
    return function() {
        let now = Date.now();
        let context = this;
        let args = arguments;
        if (now - previous > wait) {
            func.apply(context, args);
            previous = now;
        }
    }
}

定时器版本

function throttle(func, wait) {
    let timeout;
    return function() {
        let context = this;
        let args = arguments;
        if (!timeout) {
            timeout = setTimeout(() => {
                timeout = null;
                func.apply(context, args)
            }, wait)
        }

    }
}
代码解析

当执行 throttle 函数时,timeout 默认为 undefined , 此时, ! timeout true 时,执行 定时器,并且 将 timeout 为 null,即为 false, 再次执行 throttle 函数时, !timeout 又为 true ,再次执行定时器。

通过 timeout 的状态来达到节流的控制

总结

  • 防抖: 触发事件后,一定时间后再执行事件,可以 立即执行 也可以 一定时间再执行

  • 节流: 控制流量,在单位时间内只能请求一次,避免多次触发事件,影响服务器性能。

结语

❤️关注+点赞+收藏+评论+转发❤️,原创不易,鼓励笔者创作更好的文章
参考

https://github.com/mqyqingfeng/Blog/issues/26

相关文章
|
4月前
|
SQL 运维 前端开发
工单事项梳理工具深度分析:助力团队提高响应效率与问题闭环率的关键手段
在技术团队协作中,工单常暴露出问题重复、责任不清、缺乏复盘等短板。本文提出“工单转任务”的事项梳理机制,通过结构化拆解、可视化推进、知识沉淀等手段,提升协作效率与服务质量,适用于运维、研发、数据治理等场景。
|
8月前
|
SQL 人工智能 自然语言处理
《解锁AI生成SQL新姿势:少样本提示,让查询精准度狂飙》
在数字化时代,数据是企业的核心资产,而SQL查询的准确性直接影响数据洞察的质量。AI生成SQL虽降低了技术门槛,让业务人员可通过自然语言查询数据库,但其对复杂场景的理解仍存不足,易产生语法或逻辑错误。少样本提示通过提供少量相关示例,帮助AI更精准地理解需求,显著提升SQL生成的准确性与灵活性。实际应用中,某零售企业利用此技术将查询准确率提高30%,效率提升5倍,助力决策优化。未来,少样本提示有望进一步推动AI在数据查询领域的广泛应用,释放更大价值。
292 6
|
8月前
|
机器学习/深度学习 人工智能 运维
《人工智能赋能网络拓扑分析:洞察关键节点与脆弱链路》
在数字化时代,网络作为现代社会的神经中枢,其关键节点与脆弱链路对性能和稳定性至关重要。传统方法在识别这些要素时面临局限,而人工智能技术(如机器学习、深度学习和强化学习)提供了新解决方案。通过分析网络拓扑数据,AI能精准识别关键节点与脆弱链路,优化资源配置并提升网络可靠性。实践案例表明,AI已显著改善互联网公司和智能交通网络的运维效率。未来,随着算法优化和技术融合,AI将在复杂网络中发挥更大作用,推动社会信息化迈向新高度。
209 2
|
人工智能
有效上下文提升20倍!DeepMind发布ReadAgent框架
【4月更文挑战第10天】DeepMind的ReadAgent框架解决了大型语言模型处理长文本的局限,模仿人类阅读策略,将长文分块并生成gist记忆。实验显示,ReadAgent在长篇文档理解任务上超越基线,有效上下文长度提升3至20倍。该方法无需特殊训练,但可能不适应所有类型长文本,且在极长文本中可能丢失细节,增加计算成本。
291 1
有效上下文提升20倍!DeepMind发布ReadAgent框架
|
BI 数据库 开发者
宜搭认证课程-数据报表设计(一)|学习笔记
快速学习宜搭认证课程-数据报表设计(一)
971 0
宜搭认证课程-数据报表设计(一)|学习笔记
|
机器学习/深度学习 算法 知识图谱
【论文速递】ACL 2020 - 一种用于关系三元组抽取的级联二元标记框架
从非结构化文本中抽取关系三元组对于大规模知识图构建至关重要。然而,现有的工作很少能解决重叠三元组问题,即同一句子中的多个关系三元组共享相同的实体。
352 0
|
存储 算法 Java
md5base64 是什么,md5 base64使用场景, base64优势,Android 使用md5
md5base64 是什么,md5 base64使用场景, base64优势,Android 使用md5
|
SQL XML 安全
Mybatis中${}和#{}的区别
Mybatis中${}和#{}的区别
745 0
|
机器学习/深度学习 人工智能 监控
关于人工智能和机器学习的10个TED演讲
人工智能一直是一个既有魅力又有幻想的话题,通常出现在计算机科学和好莱坞电影的领域。随着人工智能和机器学习等相关的子学科在人们的日常生活中成为现实,这种吸引力也在增长。
697 0
|
数据处理 机器学习/深度学习 算法
语音顶会Interspeech 论文解读|Audio Tagging with Compact Feedforward Sequential Memory Network and Audio-to-Audio Ratio Based Data Augmentation
Interspeech是世界上规模最大,最全面的顶级语音领域会议,本文为Zhiying Huang, Shiliang Zhang, Ming Lei的入选论文
语音顶会Interspeech 论文解读|Audio Tagging with Compact Feedforward Sequential Memory Network and Audio-to-Audio Ratio Based Data Augmentation