javascript闭包详解

闭包解释
当内部函数被保存到外部时,会形成闭包,闭包会导致原有作用域链不释放,导致内存泄露(解释: 内存被占用,内存就变小了)

 

闭包作用

1实现共有变量(函数累加器) 

2可以做缓存(存储结构)(eater)

3可以实现封装,属性私有化(Person()) 

4模块化开发,防止污染全局变量

 

看下面例子:

function a() {
    var a = 100
    function b() {
      a++
      console.log(a)                
    }
    return b
}
var demo = a()  //b带着作用域链出来(形成了闭包)  b defined 0 : aAO   1 : GO 
demo() //101    //b执行    b doing   0 : bA0   1 : aAO   2 : GO   执行完销毁bAO   0 : aAO   1 : GO
demo() //102    //b执行    b doing   0 : bA0   1 : aAO   2 : GO   执行完销毁bAO   0 : aAO   1 : GO

 

闭包会导致多个执行函数公用一个公有变量,看一下例子

function test() {
   var arr = []
   for(var i = 0; i < 10; i++) {
     arr[i] = function() {
        console.log(i)
     }
   }
   return arr
}
var myArr = test()
for(var j = 0; j < 10; j++) {
   myArr[j]()  //输出10个10  公用同一个testAO
}

为了避免公用一个作用域,可以通过立即执行函数给每一个arr[i]独立的作用域,如下改造例子

function test() {
    var arr = []
    for(var i = 0; i < 10; i++) {
        (function(a) {
            arr[a] = function() {
                console.log(a)
            }
        }(i))
    }
    return arr
}
var myArr = test()
for(var j = 0; j < 10; j++) {
    myArr[j]()  //输出1,2,3...8  每个执行函数有对应的一个立即执行函数的AO,每个AO的互相独立
}                    

 

闭包变量私有化

var inherit = (function() {
  var F = function() {}  //变量私有化
  return function() {
  }
}())

实际例子如下

function Person(name, wife) {
  var perpareWife = 'xiaoli'  //闭包,私有变量
  this.name = name
  this.wife = wife   this.divorce = function() {     this.wife = perpareWife   },   this.changePerpareWife = function(target) {     perpareWife = target   },   this.sayPerpareWife = function() {     console.log(perpareWife)   } } var person = new Person('lyj', 'xiaozhang') console.log(person.perpareWife) //undefined perpareWife属性是私有的,不能直接访问,只能通过方法去访问

 

再看一下闭包例子

function fun(n,o) {
   console.log(o)
   return {
       fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);

 最后答案   undefined   0   0   0

     undefined   1   2   3

     undefined   0   1   1

 

end!!!

posted @ 2020-10-14 14:49  杰哥之家  阅读(94)  评论(0编辑  收藏  举报