作者:超_级如新公司 | 来源:互联网 | 2023-09-23 19:39
var i=0
function f1(){
function f2(){alert(i++)}
return f2
}
m=f1()
m()
m()
m()
我对内存泄漏概念理解的还不是太清楚,请问这个闭包,造成内存泄漏了吗
11 个解决方案
这个并不会造成 stack overflow,这有篇关于闭包的文章,希望对你有帮助
http://blog.csdn.net/crystalnb/article/details/7817022
过度使用闭包确实会占用内存,不过js内存泄露还真没听说过。
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的内存就泄漏了
楼上说的确实有道理,不过removeChild只是从文档表象上删除,并没有删除它的引用,所以会内存泄漏。但这种问题一般发生的不多,因为鉴于网页的时效性,一个网页打开的时间不会太长,所以js主要考虑的还不是内存泄漏问题。
4楼错的很厉害,remove只是从DOM树中移走,和删除无关,你照样可以调用那个div,也许麻烦一点,得用for in,可以把他搜出来,再用delete关键字删除。内存泄露指的是再也访问不到的东东未从内存中释放吧!
ECMAScript很安全。
你这个应该算是闭包。 但是调用的确是全局变量。到底会不会造成内存泄漏。期待高人解答!顶下!
放心,根本就没有内存泄露,程序出现了四次条用函数,第一次调用把f2的引用赋值给全局变量m,这样m指向f2对象,后面出现了三次调用m,里面连循环引用都没有,只是多了个全局变量不能被回收,如果不再想在全局环境调用f2,可以令m = null;