闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。
变量作用域
考虑如下情况:
|
|
函数foo()
创建了一个局部变量a
,仅在函数内部可以访问。
再考虑一种情况:
|
|
执行函数outer()
后,localVal
被释放。
闭包
现在来看一个有意思的例子
|
|
函数outer()
创建了一个局部变量localValue
,和一个函数getLocalValue()
。在执行语句var func = outer()
过后,我们可能会认为localValue
就无法被访问到了。然而事实并非如此,执行func()
仍然能够访问到变量localValue
。
造成这个现象的原因就是func
变成了一个闭包。闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。在这个例子中,func
是一个闭包,由getLocalValue
和localValue
组成。
闭包的应用
我们有意识或无意识地都使用到了闭包,比如DOM的绑定事件
|
|
当点击页面时,就访问到了创建闭包时的局部变量localData
。