当函数执行完毕时,管理内存的本地方法会将函数中所有创建了的东西从内存中移除。因为函数已经执行完毕,所以我们似乎不再需要访问该执行内存中的任何东西了。
1 | (function(){ |
一旦函数执行完成,prisoner变量就不再需要保存在内存中了。
1 | var prison = (function(){ |
我们仍然不需要在匿名函数执行后访问prisoner变量。因为字符串Jsoh已经保存在prison.prisoner中,没有理由再在模块所在的内存中保存prisoner变量,因为它不用再被访问。prison.prisoner的值是字符串Jsoh,但是它不再指向prisoner变量。
1 | var prison = (function(){ |
现在,每次执行prison.prisoner时都会访问prisoner变量。prison.prisoner()返回prisoner变量的当前值。如果垃圾回收器来把它从内存中移除了,调用prison.prisoner会返回undefined,而不是Jsoh。
所以什么是闭包?闭包是阻止垃圾回收器将变量从内存中移除的方法,使得在创建变量的执行环境的外面能够访问到该变量。当prisoner函数被保存到prison对象上时,一个闭包就创建了。闭包因保存函数而被创建,在执行函数的外面,可以动态访问prisoner的值,这就阻止了垃圾回收器将prisoner变量从内存中移除。