闭包
在 JavaScript 中,你可以在其他函数内部声明并返回函数。内部函数可以访问在其上方声明的任何变量。
function createAdder(a) {
return function add(b) {
const sum = a + b;
return sum;
}
}
const addTo2 = createAdder(2);
addTo2(5) // 7
addTo2(0) // 2
内部函数 add
可以访问 a
。这允许了外部函数充当新函数的工厂,每个函数都具有不同的行为。
闭包 VS 类
在上面的示例中,createAdder
非常类似于类构造函数。
class Adder {
constructor(a) {
this.a = a;
}
add(b) {
const sum = this.a + b;
return sum;
}
}
const addTo2 = new Adder(2);
addTo2.add(5); // 7
除了语法上的差异之外,这两个示例在本质上具有相同的目的。它们都允许你在「构造函数(Constructor)」中传递一些状态,并具有可以访问此状态的「方法 (Method)」。
它们之间一个关键的区别是闭包允许真正的 封装。在类的示例中,没有任何限制阻止你编写 addTo2.a = 3;
并破坏其预期行为。然而,在闭包的示例中,理论上无法访问 a
另一个区别是函数在内存中的存储方式
- 如果创建了许多类的实例,每个实例都存储对 原型对象 的单一引用,其中都存储了所有「方法(Method)」
- 而对于闭包,所有「方法(Method)」都在每次调用外部函数时生成并存储了一个「副本(Copy)」
因此,在同时有多种方法可用的情况下,类可以在性能方面体现更高的效率。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现