什么是闭包

  变量背包、作用域链、局部变量不销毁、函数体外访问函数的内部变量、内存泄漏、内存溢出、形成块级作用域、柯里化、构造函数中定义特权方法、Vue中数据响应式Observer


闭包的定义:内部函数可以访问到其所在外部函数中声明的参数和变量。 一个函数和词法环境的引用捆绑在一起,这样的组合就是闭包(closure)。一般就是一个函数A,return 其内部的函数B,被 return 出去的 B 函数能够在外部访问 A 函数内部的变量,这时候就形成了一个 B 函数的变量背包,A 函数执行结束后这个变量背包也不会被销毁,并且这个变量背包在A函数外部只能通过B函数访问。

闭包形成的原理:作用域链,当前作用域可以访问上级作用域中的变量。

闭包解决的问题:能够让函数作用域中的变量在函数执行结束之后不被销毁,同时也能在函数外部可以访问函数内部的局部变量。全局作用域中是访问不到局部作用域里面的变量的,js提供的解决办法就是在函数里面在定义一个函数

闭包带来的问题:由于垃圾回收器不会将闭包中变量销毁,于是就造成了内存泄露,内存泄露积累多了就容易导致内存溢出。 

闭包的应用:能够模仿块级作用域,能够实现柯里化,在构造函数中定义特权方法、Vue 中数据响应式 Observer 中使用闭包等。

 

function fn(){
    var a=1;
    function add(){
        console.log(++a); //2
    }
    return add;
}
var c=fn();
c();    //fn()函数执行后,把fn返回的局部函数赋值给全局变量,由于全局变量在代码执行过程中是不会被销毁的,所以它用到的值即局部函数没有被销毁,而局部函数中使用的变量也就保存下来了
var i = 0;
function fn2(){
  function add(){
       i++;
       console.log(i);
  }
  return innnerFn;
}
var b= fn2();
var c= fn2();
b(); //1
c(); //2
b(); //3
c(); //4这里i是全局变量,i一直保存在内存中;
//对象中使用闭包
function person(name){
    function get(){
        console.log(name);
    }
    this._get=function(){
        return get;
    }
}
var p=new person('xm');
var pp=p._get();
pp(); //xm

 

posted @ 2022-09-16 11:14  CodeFan*  阅读(70)  评论(0编辑  收藏  举报