《JavaScript高级程序设计》中写道:“闭包是指有权访问另外一个函数做用域中的变量的函数”,若是用下定义的观点看,这句话就是说“闭包是函数”,我带着怀疑的心态又去网上找了找,发现什么说法都有,终究没能明白闭包的含义,仍是看代码来得直接。闭包
function outter(){ var sky="blue"; function inner(){ console.log(sky); } return inner; } var result=outter(); result(); //"blue"这段代码就包含一个简单的闭包:outter函数的返回值是一个函数,即inner。inner在outter内部,理所固然能访问到局部变量sky,但当inner做为outter的返回值赋给outter外的全局变量时,神奇的事情发生了:在全局做用域中访问到了sky,这就是闭包。函数
每一个函数都有本身的执行环境,当一个函数被执行时,它的执行环境就会被推入环境栈,其活动对象(存储环境中定义的变量及函数)加入做用域链中,一旦函数执行完,栈将其环境弹出,活动对象被销毁。this
对于上面的例子来讲,outter执行完以后将返回inner给了result,outter的执行环境从环境栈弹出,控制权交给全局环境,outter的活动对象理应被销毁。但此时inner已经存储在全局活动对象中了,同时inner须要访问sky,因此outter的活动对象没有被销毁,即便result执行完毕,outter的活动对象依然存在于做用域链中,只有当result被销毁设计
result = null;outter的活动对象才会完全释放。code
说了这么多,闭包到底有什么用呢?我我的认为闭包最大的用处就是防止对全局做用域的污染。 试想若是咱们把一些仅仅只用到一两次的变量都声明在全局做用域中,最后确定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。对象
闭包将函数的活动对象维持在内存中,过分使用闭包会致使内存占用过多;ip
闭包只能取得外部函数中任何变量的最后一个值,在使用循环且返回的函数中带有循环变量时会获得错误结果;内存
当返回的函数为匿名函数时,注意匿名函数中的this指的是window对象。作用域