日期:2014-05-16  浏览次数:20431 次

JavaScript对象模型-执行模型(笔记4)

JavaScript中的闭包Closures
示例:

//Passed?in?FF2.0,?IE7,?Opera9.25,?Safari3.0.4
function?outer(){
????
var?a="aaa";
????
var?b="bbb";
????
return?function(){?return?a?+?"?"?+?b;?};
}
var?inner=outer();
document.write(inner());
outer返回的是一个内嵌函数,内嵌函数使用了outer的局部变量a和b。照理outer的局部变量在返回时就超出了作用域因此inner()调用无法使用才对。这就是闭包Closure,即函数调用返回了一个内嵌函数,而内嵌函数引用了外部函数的局部变量、参数等这些应当被关闭(Close)了的资源。

根据前面Scope Chain的理解可以解释,返回的内嵌函数已经持有了构造它时的Scope Chain,虽然outer返回导致这些对象超出了作用域、生存期范围,但JavaScript使用自动垃圾回收来释放对象内存: 按照规则定期检查,对象没有任何引用才被释放。因此上面的代码能够正确运行。

关于使用Closure时的内存泄漏、效率等问题,参考http://www.jibbering.com/faq/faq_notes/closures.html