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中很容易造成内存泄漏,即被闭包引用的变量不会被垃圾回收机制回收而始终存在于内存中,滥用闭包也会导致内存中存储过多变量导致网页性能问题。
因此调用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; } }