码迷,mamicode.com
首页 > 其他好文 > 详细

关于闭包

时间:2014-09-09 11:35:38      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   ar   div   问题   cti   

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;
     }
}

 

关于闭包

标签:style   blog   color   io   使用   ar   div   问题   cti   

原文地址:http://www.cnblogs.com/SLEBEE/p/3959587.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!