首页 > 代码库 > 关于闭包

关于闭包

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

function aa(){var a = 1;return function(){a++;alert(a);}; } var b =aa();b();//输出2b();//输出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;     }}

 

关于闭包