关于闭包

1.闭包可以避免全局污染
2.闭包可以将需要的值长期驻扎在内存中以供使用
3.可以提供私有成员
以下是简单闭包例子

function aa(){
var a = 1;
return function(){
a++;
alert(a);
}; 
} 
var b =aa();
b();//输出2
b();//输出3
alert引用了外部函数aa()中的a,因此a的值将不会在aa()执行完毕后被刷新,而是会长期驻扎在内存中。
因此调用b的时候将会实现累加; 
我的理解:闭包是指有权利访问另一个函数作用域中的函数,最简单的闭包就是函数内部再创建一个函数,内部函数能够引用外部函数的的变量,并且可以将这个引用的变量的值长期存于内存之中,不会因为连续调用重新初始化这个值。这个特点在ie中很容易造成内存泄漏,即被闭包引用的变量不会被垃圾回收机制回收而始终存在于内存中,滥用闭包也会导致内存中存储过多变量导致网页性能问题。
 
2.闭包的运行机制
下列代码
var name = "The Window";   
  var object = {   
    name : "My Object",   
    getNameFunc : function(){   
      return function(){   
        return this.name;   
     };   
    }   
};   
alert(object.getNameFunc()());  //The Window

getNameFunc : function(){   
      return this.name;   
    } //此时的话返回的是“My Object”
 

我的理解:首先,匿名函数的执行环境具有全局性,因此this对象通常指向window,此处创建了一个object,object内创建了一个getNameFunc方法,这个方法返回一个匿名函数,这个匿名函数返回this.name,this返回的是当前作用域的活动对象,即是getNameFunc的this返回的object,而里面的function的this是不可能访问到上一层的this对象的,除非将外部作用域中的对象保存在一个闭包能访问到的变量中,就能让闭包访问到这个对象。所以这个时候内部的function返回的this.name中的this由于获取不到上一层的function的作用域,所以默认的匿名函数执行环境具有全局性的原因,这个this指的就是window,因此输出的就会是“The window”。

如果要让这个闭包访问到object的name,可以将getNameFunc的执行作用域的this保存一下给里面的闭包访问:

getNameFunc:function(){
    var that = this;
     return function(){
          return that.name;
     }
}

 

转载于:https://www.cnblogs.com/SLEBEE/p/3959587.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值