请问这个闭包,造成内存泄漏了吗

coglass 2012-08-09 08:23:47

var i=0
function f1(){
function f2(){alert(i++)}
return f2
}
m=f1()
m()
m()
m()


我对内存泄漏概念理解的还不是太清楚,请问这个闭包,造成内存泄漏了吗
...全文
319 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxc122333 2012-08-20
  • 打赏
  • 举报
回复
在js中所谓的内存泄露一般指的是 遗忘自己在闭包中声明的变量,长时间占用内存

这个问题貌似只有ie6会影响系统,其他浏览器关掉网页就无所谓了,所有的空间都会释放掉

一般nodejs中会比较关注内存泄露,因为服务端程序要长时间运行,内存的占用问题很关键

举个例子吧(可以试试,打开任务管理器看看内存)


function f1(){
var a=[];
for(var i=0;i<1000000;i++)
a.push(i);
return function(){alert(a[0]);};
}

var b=f1();


这段代码会造成几百M的内存占用,忘记释放就会一直占用
怎么释放呢? b=null就可以了

这个是非常简单的一个例子,实际应用中会有很多比这复杂的多的情况,产生各种泄露
  • 打赏
  • 举报
回复
放心,根本就没有内存泄露,程序出现了四次条用函数,第一次调用把f2的引用赋值给全局变量m,这样m指向f2对象,后面出现了三次调用m,里面连循环引用都没有,只是多了个全局变量不能被回收,如果不再想在全局环境调用f2,可以令m = null;
未知数 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
4楼错的很厉害,remove只是从DOM树中移走,和删除无关,你照样可以调用那个div,也许麻烦一点,得用for in,可以把他搜出来,再用delete关键字删除。内存泄露指的是再也访问不到的东东未从内存中释放吧!
ECMAScript很安全。
[/Quote]

不要乱说,只要没有被其他还生存的变量持有,对象资源是会自动释放的,delete只能用来删除一个变量,和把该变量赋值为null的效果是一样的;就我那种写法,用一个全局变量持有对象,在该变量释放前,你delete该对象的其他引用一样没法释放资源
bugknightyyp 2012-08-10
  • 打赏
  • 举报
回复
这个并不会造成 stack overflow,这有篇关于闭包的文章,希望对你有帮助 http://blog.csdn.net/crystalnb/article/details/7817022
joybee007 2012-08-10
  • 打赏
  • 举报
回复
楼上说的确实有道理,不过removeChild只是从文档表象上删除,并没有删除它的引用,所以会内存泄漏。但这种问题一般发生的不多,因为鉴于网页的时效性,一个网页打开的时间不会太长,所以js主要考虑的还不是内存泄漏问题。
未知数 2012-08-10
  • 打赏
  • 举报
回复
js是可能内存泄漏的,但你这个不会,反复操作的都是同一个全局变量

举个泄漏的例子
function addDiv(){
var obj= document.createElement("div");
obj.id=Math.random();
window[obj.id]=obj;
document.body.appendChild(obj);
return obj;
}
function removeDiv(divObj)
{
document.body.removeChild(divObj);
}
这两个函数,一个添加div,一个移除
按理说移除后,创建的div会自动释放,不会占用内存,
但事实是,因为有全局对象window的成员持有该div,所以不会释放内存
所以该div的内存就泄漏了
joybee007 2012-08-10
  • 打赏
  • 举报
回复
过度使用闭包确实会占用内存,不过js内存泄露还真没听说过。
gf05011 2012-08-10
  • 打赏
  • 举报
回复
这个应该不是闭包
kaifadi 2012-08-10
  • 打赏
  • 举报
回复
你这个应该算是闭包。 但是调用的确是全局变量。到底会不会造成内存泄漏。期待高人解答!顶下!
JS_DOM 2012-08-10
  • 打赏
  • 举报
回复
4楼错的很厉害,remove只是从DOM树中移走,和删除无关,你照样可以调用那个div,也许麻烦一点,得用for in,可以把他搜出来,再用delete关键字删除。内存泄露指的是再也访问不到的东东未从内存中释放吧!
ECMAScript很安全。

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧