什么是闭包
我对闭包的理解就是一个局部变量加上一个可以访问这个局部变量的函数的总和,就形成了一个闭包。在JS中由于函数作用域的原因,如果需要局部变量,那就要把它放进函数内部,而又因为只有子函数可以访问局部变量,所以闭包的形式通常是一个函数嵌套在另一个函数内部。
例如以下这种形式:
function foo(){
var local = 1
function bar(){
local++
return local
}
return bar
}
var func = foo()
func() //2
在这里,local 变量和 bar 函数就组成了一个闭包(Closure)
闭包的作用
闭包常常用来访问局部变量,如果不用闭包,定义一个全局变量,那这个值很容易被别人修改,所以使用局部变量,但是别人又访问不了局部变量,所以要暴露一个访问器函数,外界只有通过这个访问器才能访问局部变量
var foo = (function() {
var secret = 'secret';
// “闭包”内的函数可以访问 secret 变量,而 secret 变量对于外部却是隐藏的
return {
get_secret: function() {
// 通过定义的接口来访问 secret
return secret;
},
new_secret: function(new_secret) {
// 通过定义的接口来修改 secret
secret = new_secret;
}
};
} ());
foo.get_secret(); // 得到 'secret'
foo.new_secret('a new secret'); // 通过函数接口,我们访问并修改了 secret 变量
foo.get_secret(); // 得到 'a new secret'
闭包的应用场景
闭包随处可见,一个Ajax请求的成功回调,一个事件绑定的回调方法,一个setTimeout的延时回调,或者一个函数内部返回另一个匿名函数,这些都是闭包
关于闭包的误解
许多人认为闭包会造成内存泄漏,其实并不会,这只是IE老版本浏览器的垃圾回收BUG,在闭包使用完之后,IE无法回收闭包内的变量,这是IE浏览器自身的问题,而不是闭包的问题。
内存泄漏指的是变量访问不到,又不会被回收,占据着内存空间,而闭包中的变量是我们可以访问并且可回收的,所以不要再冤枉它啦!