//函数a中包含了函数b,则形成了js闭包。 function a() { var obj={}; for(var i=0;i<20000000;i++) { obj[i]=i; }
function b()
{
console.log(Object.keys(obj).length)
}
return b;
} 第一种方式: a();//直接执行a函数,虽然a函数的返回值返回了b函数,但是b函数并没有被外部变量引用,所以b函数中引用的a函数作用域中的obj对象会被GC销毁。内存不会增加。 第二种方式: var c=a();//把a函数的返回值赋给外部变量c,则函数a的返回值b被外界变量c引用,而且b引用了a函数作用域中的obj,所以a函数的局部变量obj不会GC被销毁,会一直在内存中保存。 总结,由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。如上例,想销毁闭包内存,可以使用c=null;
注:内存测试方法,上面代码下面加上这段代码 setInterval(function(){ var obj1={}; for(var i=0;i<20000;i++) { obj1[i]=i; } },1000); 保持程序不退出,node是在申请新内存的时候才去检查是否需要回收内存,所以要开辟新内存才能查看到效果
记住这几点就行,闭包必须是局部变量(当然。。);循环闭包里只闭包一次;每次调用都会产生新的闭包;外部函数所有局部变量都在闭包内,即使在闭包函数后面申明的。