/* JavaScript实现了自动释放内存的系统,当代码不再需要时,就从电脑的内存中把它移除。这些自动化系统叫做垃圾回收(garbage collector)。 当函数执行完毕时,管理内存的本地方法会将函数中所有创建了的东西从内存中移除。毕竟函数已经执行完毕,所以似乎我们不再需要访问该执行环境中的任何东西了。 */ /* var prison = function () { var prisoner = 'Josh Powell'; }; prison(); */ /* 一旦prison完成执行,我们就不需要访问prisoner变量,所以Josh自由啦。这种模式有点繁琐,所以我们把它转换为自执行匿名函数的模式。 */ /* (function () { var prisoner = 'Josh Powell'; })(); */ /* 这是同一回事,函数执行完成时,prisoner变量就不再需要保存在内存中了。再见Josh! 我们把这一段代码粘帖到模块模式中去。 */ var prison = (function() { var prisoner = 'Josh Powell'; /* 将变量或者函数保存为对象上名字相同的属性,然后由模块模式返回该对象,我们对这一做法会非常熟悉:整本书都使用这种做法。 */ return { prisoner: prisoner }; })(); // outputs 'Josh Powell' console.log( prison.prisoner ); /* 我们仍然不需要在匿名函数执行后访问prisoner变量。因为字符串Josh Powell已经保存在prison.prisoner中,没有理由再在模块所在的内存中保存prisoner变量,因为它不能再被访问。
prison.prisoner的值是字符串Josh Powell。 */ var prison = (function() { var prisoner = 'Josh Powell'; return { prisoner: function () { return prisoner; } } })(); // console.log( prison.prisoner() ); /* 现在我们终于可以回答“什么是闭包”这个问题了。闭包是阻止垃圾回收器将变量从内存中移除的方法,使得在创建变量的执行环境的外面能够访问到该变量。
在prisoner函数被保存到prison对象上时,一个闭包就创建了。闭包因保存函数而被创建,闭包因保存函数而被创建,在执行环境的外面,可以动态的访问prisoner变量,
这就阻止了垃圾回收器将prisoner变量从内存中移除。 */
我们再多看几个闭包的示例。