闭包的典型应用--节流与防抖

Javascript 闭包与高阶函数 本文系统讲解了JavaScript中的闭包和高阶函数。闭包是指函数能够访问其词法作用域的特性,即使外部函数已执行完毕,其关键特征包括函数嵌套、变量引用和函数返回。常见应用有数据封装、防抖节流等,但需注意内存泄漏风险。高阶函数则是指操作其他函数的函数,包括接收函数参数或返回函数的特性。文章详细介绍了数组高阶方法(map/filter/reduce等)、自定义高阶函数(装饰器、节流防抖、柯里化等)的实现原理和应用场景。最后强调高阶函数的核心价值在于不修改原函数的情况下实现功能增强,这是AOP、中间件等设计模式的 阅读详情


1.定义

函数防抖(debounce)

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

简单的说,当一个动作连续触发,只执行最后一次。

函数节流(throttle)

限制一个函数在一定时间内只能执行一次

为了方便理解,我们首先通过一个可视化的工具,感受一下三种环境(正常情况、函数防抖情况 debounce、函数节流 throttle)下,对于mousemove事件回调的执行情况。

竖线的疏密代表事件执行的频繁程度。可以看到,正常情况下,竖线非常密集,函数执行很频繁。而 debounce (函数防抖)则很稀疏,只有当鼠标停止移动时,才会执行一次。throttle(函数节流)分布的较为均匀,每过一段时间就会执行一次。

2.简单实现

function debounce(fn, delay = 500) {
    // timer 是在闭包中的
    let timer = null;
    
    return function() {
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            fn.apply(this, arguments)
            timer = null
        }, delay)
    }
}

// test debounce 返回一个函数
input1 = document.getElementById('input1')
input1.addEventListener('keyup', debounce(function () {
    console.log(input1.value)
}, 600))
function throttle(fn, delay) {
    let timer = null
    
    return function() {
        if (timer) {
            return
        }
        timer = setTimeout(() => {
            fn.apply(this, arguments)
            timer = null
        })
    }
}
// test
let div1 = document.getElementById('div1')
div1.addEventListener('drag', throttle(function(e) {
    console.log(e.offsetX, e.offsetY)
}, 100))

3. 应用

函数防抖(debounce)的应用场景

连续的事件,只需触发一次的回调场景有:

  • 搜索框搜索输入。只需要用户最后一次输入完再发送请求
  • 手机号、邮箱格式的输入验证检测
  • 高频点击提交,表单重复提交。

函数节流(throttle)的应用场景

间隔一段时间执行一次回调的场景有:

  • 滚动加载,加载更多或滚动到底部监听
  • 谷歌搜索框,搜索联想功能
  • 窗口大小的 resize 。只需窗口调整完成后,计算窗口的大小,防止重复渲染
  • 省市信息对应字母快速选择

 4. vue 中使用
  

debounce(){
 
    let timer = null;
    return function(){
		if(timer) {
         clearTimeout(timer);
        }else{
         timer = setTimeout(this.func, 200);
        }
    }()  
},
func(){
   console.log("11111")
}

JavaScript防抖与节流函数实战详解 说了这么多,最后我们来做个终极总结。场景推荐方案理由搜索建议、自动保存✅ 防抖(trailing)用户停止输入后再请求按钮防重复点击✅ 防抖(leading)点击立刻生效,防止连点滚动监听、懒加载✅ 节流(时间戳)保持一定频率更新鼠标移动绘画✅ 节流(16ms)控制帧率防卡顿窗口 resize✅ 防抖 or 节流 or 两者结合视需求选择高频状态同步更先进的观察者模式。 阅读详情

相关推荐

第18届全国大学生智能汽车竞赛四轮车控制策略深度解析:从舵机PID到速度闭环

本文深度解析了第18届全国大学生智能汽车竞赛中四轮车的核心控制策略。从舵机PID方向控制的基础原理与机械校准入手,详细阐述了误差计算、PD控制等关键环节;进而深入探讨了基于编码器的速度闭环控制,包括增量式PI算法与速度决策逻辑。文章结合实战经验,提供了方向环与速度环的协同调参思路与避坑指南,旨在帮助参赛者构建稳定、高效的智能车控制系统。

potato的博客 464

闭包--防抖和节流的应用场景及区别

防抖节流以及使用场景

CC酱写前端的博客 3632

基于OpenCV C++实现工业级形状模板匹配:仿Halcon SBM算法全解析

在计算机视觉和工业自动化领域,模板匹配是一项基础且关键的技术,用于在图像中定位已知目标。其核心原理是通过计算图像区域与预设模板之间的相似度来识别目标位置。传统的基于灰度值的匹配方法对光照变化敏感,鲁棒性不足。而基于边缘梯度方向的形状匹配技术,通过计算轮廓梯度方向的一致性进行相似度度量,从根本上提升了对光照变化的鲁棒性,并支持目标的旋转与缩放,技术价值显著。这项技术广泛应用于工业视觉检测、机器人引导、PCB定位等对精度和稳定性要求极高的场景。本文聚焦于使用开源OpenCV库,从底层仿照Halcon的Shape

weixin_33691817的博客 502

JS 节流防抖

防抖是将多次执行变为最后一次执行,一个高频事件触发后 n 秒内函数只会执行一次,如果在 n 秒内高频事件再次被触发,则重新计算时间。这就像如果你正在等公交车,只要在等待时间内有人上车,公交车就会等到这个时间结束后才开走。关键点:setTimeout 定时器 apply arguments 闭包。

weixin_48813932的博客 687

从东南大学906被刷到调剂过程(内含个人感想)

介绍了自己在看到初试成绩,到后期复习以及调剂的全过程,当中也包含了自己的复试中的感想,希望大家理性看待。

Philo的博客 2859

【2005】人工智能⭐

问题的解答来自于过去的经验而不是规则,这些经验是以案例方式存储的。但是当人们遇到一个新的问题的时候,一般先是回忆,从记忆中找到一个与新的问题相似的案例,然后把该案例的有关信息和知识复用到新问题的求解之中。1、若案例(case)不够充足,而有足够的规则(知识),试问如何构建一个包含有基于案例推理和基于规则推理的推理系统,以使推理效率提高而且总能求得问题的解。一般认为,CBR适合缺乏完备和健全的理论,但又可获取丰富经验的领域,而RBR则适合于对领域有充分的认识,能以完备和健全的形式表示领域理论的场合。

super_mochi1 282

闭包----防抖与节流

闭包: 函数嵌套函数,内部函数就是闭包; 体会闭包 function outerfun(x){ function innerfun(y){ console.log(x + y); } return inner; //没有小括号,表示只输出inner函数的定义,不会立即执行 } var i = outerfun(3); /* 其实这个时候

CC酱写前端的博客 351

高匿反爬实战:Python打造无痕爬虫,规避风控系统追踪

网络层匿踪:核心是使用住宅IP代理池,按真实用户IP画像匹配,控制请求频率;协议层匿踪:动态生成请求头(每次都不同),参数添加随机噪声,避免规律化;行为层匿踪:模拟人类的非规律行为(贝塞尔轨迹、随机停顿、非精准点击);设备层匿踪:伪造Canvas/WebGL指纹,禁用webdriver标识,每次请求更换指纹;核心原则:无痕爬虫的本质是“无限接近真实用户”,所有维度都要消除爬虫特征,而非单一维度伪装。打造真正的无痕爬虫需要全维度的匿踪策略,单一维度的伪装极易被高级风控系统识别。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2646

通过闭包实现防抖节流

通过闭包实现防抖节流 防抖目的:用户触发时间过于频繁,只执行最后一次。节流目的:控制执行次数。

weixin_42178670的博客 1117

上位机图像处理和嵌入式模块部署(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉,以传统算法和光源控制为主,部分采用了深度学习技术。而生活当中,则主要以二维码识别、人脸识别、车牌识别和ocr识别为主,这中间深度学习与AI扮演了很重要的角色。过去,市场上的商业收费软件,主要还是以传统设备厂商提供的上位机软件为主,那这一部分是不是结合最新的npu技术,应该做出一些新的东西出来呢?

嵌入式-老费,一个分享专业嵌入式知识的blog 1338

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

wzk4869的博客 3022

JS实现,防抖&节流 + 闭包

防抖节流

yavlgloss的博客 1282

自动驾驶算法/规划决策控制算法面经汇总、学习路线、面经心得

自动驾驶算法学习路线,面试求职大全

qq_41667348的博客 1万+

JS 节流与防抖:小白也能看懂的区别与实现

本文介绍了JavaScript中节流(Throttle)和防抖(Debounce)两种性能优化技术。节流通过固定时间间隔限制函数执行频率,适用于需要均匀执行的场景;防抖通过等待时间确保只在停止触发后执行,适用于只需最后一次结果的场景。文章通过生活类比、代码实现和适用场景对比,帮助开发者理解两者的核心区别:节流是"定时执行",防抖是"等待执行"。同时强调了闭包、this指向和参数传递等实现要点。这两种技术能有效解决高频触发导致的性能问题。

前端圈边缘选手,擅长把 UI 稿 “翻译” 成代码,也擅长在 console.log 里写 “求救信号”。日常状态:要么在调像素级对齐,要么在查 “为什么这个样式只在我电脑上生效”。博客不搞高深理论,只唠实在干货~ 1070

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

详解JS中闭包原理以及应用场景

闭包原理与应用摘要 闭包是函数能够访问并保留其定义时词法作用域变量的特性,由函数嵌套、内部函数引用外部变量和外部函数执行返回内部函数三个条件构成。其核心优势在于实现变量私有化、模块化封装和状态保存,但也可能导致内存泄漏和性能问题。实际应用中,闭包广泛用于模块化设计、防抖节流函数和私有变量保护。在React Hooks中,闭包机制可能导致状态捕获问题,需要合理处理依赖数组。内存管理方面,应注意及时解除引用或使用弱引用避免泄漏。掌握闭包原理对编写高效、安全的JavaScript代码至关重要。

weixin_38881784的博客 474

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

闭包原理与常见陷阱

闭包原理与常见陷阱

欢迎来到这里,希望文章能对你有所帮助 1043

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

01_闭包原理:从变量作用域到闭包的 3 个实际用途(以计数器为例)【包含课程视频】

本文详细介绍了JavaScript闭包的核心原理与三大实际用途。首先解释了变量作用域作为闭包基础,区分全局和局部作用域的特点及问题。然后通过计数器示例演示闭包如何保留函数状态,实现安全的数据封装。文章重点分析了闭包的三大应用场景:1)保留函数状态(如计数器);2)封装私有变量;3)实现防抖/节流功能。最后提醒了闭包的内存泄漏风险和性能注意事项,强调应根据实际场景合理使用闭包技术。

weixin_56334307的博客 956

【JavaScript】闭包的详解与底层原理

本文系统介绍了JavaScript闭包的核心概念与应用。首先解析闭包的定义与本质,即通过函数嵌套保留对外层作用域的引用。其次剖析闭包的底层实现原理,包括作用域链和执行上下文机制。接着展示闭包的典型应用场景:数据封装、解决循环作用域问题、函数防抖节流等,并给出模块化工具与柯里化函数的实战案例。最后指出闭包潜在的内存泄漏风险,提出及时释放引用、优化作用域访问等解决方案。全文由浅入深,既包含基础理论也提供实用技巧,适合开发者全面掌握闭包技术要点。

1069

前端面试必学!JS闭包底层原理( 深入js作用域AO GO)

在深入闭包的底层原理之前,先深入JS作用域 AO AO的步骤: 再函数被调用之前,创建AO(Activation Object)对象,又叫执行期上下文;(上下文是唯一的,一个函数被多次被调用时会创建多个上下文) 寻找形式参数和变量声明作为AO的属性名,并赋值为undefined; 传入实际参数的值; 在函数体内寻找函数声明,放入作为AO的属性,并赋值为其函数体。 先看一个阿里面试题的例子: function test(a,b){ console.log(a) functio

weixin_47077674的博客 625

为什么90%的开发者都误解了闭包?2个关键案例揭示真相

掌握JavaScript闭包核心原理,破解常见误解。通过2个经典JavaScript闭包案例,揭示其在函数记忆与模块化中的实际应用,帮助开发者真正理解作用域链与内存管理机制。告别误用,提升代码质量,值得收藏。

VarIsle的博客 591

闭包不难懂:前端开发者必须掌握的JavaScript核心技巧(附实战场

把闭包想成外卖员背着的保温箱店家(外部函数)把饭(变量)做好,放进保温箱(return 的函数)。店家关门(外部函数执行完毕),饭却还在保温箱里。你拿到外卖(调用内部函数),打开一看,饭还是热的(变量还在)。保温箱=闭包,饭=变量,热=持久化。“外卖员的小箱子,懂了吧?

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 762

函数防抖和函数节流的使用场景与方法,相关知识点:闭包,bind改变this指向,arguments

问题引出:频繁调用函数造成性能浪费 当一个函数无意义的高频率调用时,需要设置函数函数防抖和函数节流,限制这种无意义的调用,通过调用次数的减少来提高代码性能 问题场景:搜索框实时发请求,onmousemove, resize, onscroll等等 1.input搜索框内容的输入:用户敲击键盘的时候去触发一个函数 2 resize,变化浏览器的大小,控制台会一直打印 3.拖动滚动条,会持续触发onscroll监听事件 4.鼠标移动事件中不断返回鼠标经过的位置 解决方法:函数防抖和函数节流 思路:不影响使用的

GAARA 278

前端闭包详解

本文摘要:JavaScript闭包是内层函数记住并访问外层作用域变量的机制。其核心在于词法作用域,即函数定义时的作用域决定变量查找。闭包产生于嵌套函数引用外层变量且内层函数在外层执行后仍可调用的情况。闭包"闭住"的是变量绑定而非值,常用于数据私有化、工厂函数、防抖节流等场景。典型陷阱包括循环中的var共享、内存泄漏和this混淆。闭包与原型链分别处理变量查找和属性查找的不同维度问题。理解闭包需掌握其形成条件、应用场景及潜在问题。

qq_45654366的博客 426

JavaScript闭包:从生活案例到代码实践

闭包:JavaScript的"记忆盒子" 📦 闭包是函数记住并访问其出生环境的能力,就像大脑能记住童年往事一样。它通过三个步骤形成:函数嵌套、内部引用外部变量、外层返回内层函数。 核心价值: 1️⃣ 保存变量状态(如计数器保持计数) 2️⃣ 保护数据隐私(隐藏内部变量) 3️⃣ 封装功能模块(避免全局污染) 典型应用场景: 防抖节流优化性能 🚀 柯里化函数实现参数分步传递 🧩 实现单例模式保证唯一实例 🏠 注意事项: ⚠️ 警惕内存泄漏风险(及时释放不再使用的闭包) ⚠️ 注意变

qq_31435455的博客 1076

你真的搞懂了 javascript 中的闭包吗?

JavaScript闭包深度解析:从抽象到具体 闭包是JavaScript中函数能够访问其定义时作用域的特性,即使函数在外部执行。本文深入解析闭包的核心概念: 闭包构成三要素:嵌套函数、内部函数访问外部变量、外部函数返回内部函数 工作原理:基于词法作用域和作用域链,外部函数执行后变量仍被保留 典型应用:计数器实现、数据封装、解决循环问题、函数柯里化等 实际场景:模块化开发避免全局污染,创建私有变量和方法 通过多个代码示例展示了闭包的具体实现方式和使用技巧,帮助开发者深入理解这一重要概念。

u011286604的博客 904

JavaScript闭包的10个实用场景从入门到精通

/ 从缓存返回结果。console.log('状态变化:', oldState, '->', newState);console.log('从缓存返回结果');processor('任务1').then(console.log);processor('任务2').then(console.log);

ZeYuJCco的博客 449
上一篇: Vue3+element-plus icon全局引入
下一篇: 第一章 Vue3的新特性
华而有识
博客等级 码龄10年 4粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值