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

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

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

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 @ 2021-01-03 14:42  腓腓无忧  阅读(132)  评论(1编辑  收藏  举报