var i=0
function f1(){
  function f2(){alert(i++)}
  return f2
}
m=f1()
m()
m()
m()
我对内存泄漏概念理解的还不是太清楚,请问这个闭包,造成内存泄漏了吗

解决方案 »

  1.   

    这个并不会造成 stack overflow,这有篇关于闭包的文章,希望对你有帮助 http://blog.csdn.net/crystalnb/article/details/7817022
      

  2.   

    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的内存就泄漏了
      

  3.   

    楼上说的确实有道理,不过removeChild只是从文档表象上删除,并没有删除它的引用,所以会内存泄漏。但这种问题一般发生的不多,因为鉴于网页的时效性,一个网页打开的时间不会太长,所以js主要考虑的还不是内存泄漏问题。
      

  4.   

    4楼错的很厉害,remove只是从DOM树中移走,和删除无关,你照样可以调用那个div,也许麻烦一点,得用for in,可以把他搜出来,再用delete关键字删除。内存泄露指的是再也访问不到的东东未从内存中释放吧!
    ECMAScript很安全。
      

  5.   


    不要乱说,只要没有被其他还生存的变量持有,对象资源是会自动释放的,delete只能用来删除一个变量,和把该变量赋值为null的效果是一样的;就我那种写法,用一个全局变量持有对象,在该变量释放前,你delete该对象的其他引用一样没法释放资源
      

  6.   

    放心,根本就没有内存泄露,程序出现了四次条用函数,第一次调用把f2的引用赋值给全局变量m,这样m指向f2对象,后面出现了三次调用m,里面连循环引用都没有,只是多了个全局变量不能被回收,如果不再想在全局环境调用f2,可以令m = null;
      

  7.   

    在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就可以了这个是非常简单的一个例子,实际应用中会有很多比这复杂的多的情况,产生各种泄露