什么是闭包?闭包使用场景?有什么缺点?

首先思考这样一个问题:如何从函数外部读取到函数内部的局部变量?

正常情况下,这是办不到的!只有通过变通的方法才能实现。

复制代码
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中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

 

posted @   腓腓无忧  阅读(134)  评论(1编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示