js--15----闭包是什么?说说闭包的使用场景

1、闭包是什么?

一个函数和对其周围状态(词法环境)的引用绑定在一起(或者说函数被引用包围),这样的组合就是是闭包(closure),也就是说,闭包让你在一个内层函数中访问到其外层函数的作用域。

在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来,作为函数外部与外部连接起来的桥梁。

举例:

displayName()没有自己的局部变量,然而,由于闭包的特性,它可以访问到外部函数的变量

2、使用场景

任何闭包的使用场景都离不开这两点:

创建私有变量

延长变量的周期

一般函数的词法环境在函数返回后就被销毁,但是闭包会保存对创建时所在词法环境的引用,即便创建时所在的执行上下文被销毁,但创建时所在的词法环境依然存在,以达到延长变量的生命周期的目的。

举例:

在页面添加一些可以调整字号的按钮。

2.1、柯里化函数

柯里化函数的目的在于避免频繁调用具有相同参数函数的同时,又能够轻松的重用。

2.2、使用闭包模拟私有方法

在JavaScript中,没有支持声明私有变量,但是可以用闭包来模拟私有方法。

举例:

上面通过使用闭包来定义公共函数,并令其可以访问私有函数和变量,这种模式也叫做模块模式。

两个计数器Counter1和Counter2是维护它们各自的独立性的,每次调用其中一个计数器时,通过改变这个变量的值,会改变这个闭包的词法环境,不会影响另一个闭包中的变量

2.3、其他

例如计数器、延迟调用、回调等闭包的应用,其核心思想还是创建私有变量和延长变量的生命周期

3、注意事项

如果不是某些特定任务需要使用闭包,在其他函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。

例如,在创建新的对象或者类时,方法通常应该关联与对象的原型,而不是定义到对象的构造器中,原因在于每个对象被创建时,方法都会重新赋值。

上述代码中我们并没有利用到闭包的好处,因此可以避免使用闭包,修改如下:

相关推荐
前端Hardy10 小时前
面试官:JS数组的常用方法有哪些?这篇总结让你面试稳了!
javascript·面试
yuki_uix10 小时前
Props、Context、EventBus、状态管理:组件通信方案选择指南
前端·javascript·react.js
日月云棠11 小时前
各版本JDK对比:JDK 25 特性详解
java
全栈老石11 小时前
手写无限画布4 —— 从视觉图元到元数据对象
前端·javascript·canvas
用户83071968408211 小时前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide12 小时前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
Leon12 小时前
新手引导 intro.js 的使用
前端·javascript·vue.js
IT探险家12 小时前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺12 小时前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户9083246027312 小时前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端