闭包是指有权访问另外一个函数做用域中的变量的函数。建立闭包的常见方式就是在一个函数内部建立另外一个函数。segmentfault
说明:变量分为全局变量的局部变量,全局变量的做用域为全局做用域,局部变量做用域为局部做用域。以前一篇文章关于做用域链给了介绍,能够在函数内部访问全局变量,可是没法在全局环境中访问函数内部的变量。
那若是想在全局环境中访问函数内部变量呢?这时候就可使用闭包。
闭包有两个最大的用处,一个是能够在全局做用域中读取内部函数的的变量,另外一个就是可让闭包中引用的变量始终保存在内存中。
如下纯属我的理解,有不一样意见欢迎在留言区讨论哈。
若是闭包单纯只是为了外部函数能够读取内部函数的变量,咱们也能够经过对象将想要访问的变量输出就能够,以下所示:闭包
可是闭包的另外一个目的主要是为了让闭包中引用的变量始终保存在内存中,以下图所示,调用nAdd函数修改n的值,能够发现使用闭包的函数中n的值+1:函数
缘由:当外部函数f2()执行完毕后,其活动对象也不会被销毁,由于匿名函数result2的做用域链仍然在引用这个活动对象。换句话说,当f2()函数返回后,其执行环境的做用域链会被销毁,但它被result2引用的活动对象(变量)仍然会留在内存中,直到result2被销毁,f2被引用的变量才能被回收。spa
因为闭包会携带包含它的函数的做用域,所以会比其余函数占用更多的内存。所以能够手动解除对匿名函数的引用,以便释放内存。code
function f2(){ var n=22; var nAdd=function(){n++}; return function(){ return { n:n, nAdd:nAdd } } } //result2就是建立了一个匿名函数 var result2=f2(); //调用函数 console.log(result2()); result2().nAdd(); console.log(result2()); //解除对匿名函数的引用,以便释放内存 result2=null;