闭包

闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。

变量作用域

考虑如下情况:

1
2
3
4
5
var foo= function () {
var a=1;
};
foo();
console.log(typeof(a)); //undefined

函数foo()创建了一个局部变量a,仅在函数内部可以访问。

再考虑一种情况:

1
2
3
4
5
function outer() {
var localVal = 1;
return localVal;
}
outer(); //1

执行函数outer()后,localVal被释放。

闭包

现在来看一个有意思的例子

1
2
3
4
5
6
7
8
9
function outer(){
var localValue = 1;
function getLocalValue(){
return localValue;
}
return getLocalValue;
}
var func = outer();
func(); //1

函数outer()创建了一个局部变量localValue,和一个函数getLocalValue()。在执行语句var func = outer()过后,我们可能会认为localValue就无法被访问到了。然而事实并非如此,执行func()仍然能够访问到变量localValue

造成这个现象的原因就是func变成了一个闭包。闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。在这个例子中,func是一个闭包,由getLocalValuelocalValue组成。

闭包的应用

我们有意识或无意识地都使用到了闭包,比如DOM的绑定事件

1
2
3
4
5
6
7
function clickEvent(){
var localData = 'localData Here';
document.addEventListener('click',function(){
console.log(localData);
})
};
clickEvent();

当点击页面时,就访问到了创建闭包时的局部变量localData