function foo() {
var a = 2;
function bar() {
console.log( a );
}
return bar;
}
var baz = foo();
baz(); // 2 —— 朋友, 这就是闭包的效果。
函数bar()的词法作用域能够访问foo()的内部作用域,然后我们将bar()函数本身当做一个值类型进行传递,
在这个例子中,我们将bar所引用的函数对象本身当做返回值.
在foo()执行完成之后,其返回值(),也就是内部的bar()函数,复制给变量baz并调用baz(),世纪上只是通过不同的标识符引用调用了内部的函数bar().
bar() 显然可以被正常执行.但是在这个例子中,它在自己定义的词法作用域之外的地方执行.
在foo()执行完之后,通常会期待foo()的整个内部作用域被销毁,因为我们知道引擎,有垃圾回收器来释放不再使用的内存空间. 由于看上去foo()的内容不会再被使用,所以很自然地会考虑对齐进行垃圾回收.
而闭包的神奇之处真在于此,他们阻止这件事情的发生.事实上内部作用域毅然存在,因此没有被回收,谁在使用这个内部作用域,原来是bar()本身.
bar()涵盖foo()内部作用域的闭包,使得该作用域能够一直存活,以供bar()之后任何时间进行引用
bar() 毅然会该作用域引用,这个引用就叫做闭包
闭包使得函数可以继续访问定义时的词法作用域