什么是闭包?闭包使用场景?有什么缺点?
首先思考这样一个问题:如何从函数外部读取到函数内部的局部变量?
正常情况下,这是办不到的!只有通过变通的方法才能实现。
function f1(){
var a=1;
function f2(){
console.log(a);
}
}
在上面的代码中,f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。
这就是Javascript语言特有的"链式作用域"结构:
子对象会一级一级地向上寻找所有父对象的变量。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们就可以在f1外部读取它的内部变量了
function f1(){
var a=1;
function f2(){
console.log(a);
}
return f2;
}
var F=f1();
F(); //1
闭包概念说起来很抽象,我认为闭包就是一个可以访问其他函数作用域的函数,就如上面的代码所展示的
闭包用途:
读取函数内部的变量
让变量一直保存在内存中,不会被垃圾回收机制回收
function f1(){
var a=1;
Add=function(){a++}
function f2(){
console.log(a);
}
return f2;
}
var F=f1();
F(); // 1
Add();
F(); // 2
Add没有var定义,它会变为全局变量,所以我们可以直接在全局调用它,第一次调用F()后a没有被回收,调用Add()时是在a=1情况下a++
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
分类:
JavaScript
标签:
JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构