none
js闭包引起内存泄露问题? RRS feed

  • 问题

  • 	window.onload=function outerFunction(){
    
    		var obj = document.getElementById("element");
    obj.onclick=function innerFunction(){ alert("Hi! I will leak");
    }; obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX")); // This is used to make the leak significant };

    看看这段代码为什么会引起泄露呢?
    原文是这么说的:
    在此闭包内,JavaScript 对象(obj)包含到 DOM 对象的引用(通过 id "element" 被引用)。而 DOM 元素则拥有到 JavaScript obj 的引用

    有2个疑问:
    1 他说的闭包是指这里吗 obj.onclick=function innerFunction(){...}
    2 不明白为什么DOM 元素会拥有到 JavaScript obj 的引用?

    原文链接:
    http://www.ibm.com/developerworks/cn/web/wa-memleak/index.html
    拒绝垃圾代码
    • 已移动 Sheng Jiang 蒋晟 2010年1月3日 5:42 客户端脚本问题 (发件人:ASP.NET 与 AJAX)
    2010年1月3日 3:29

答案

  • 第一  是
    这样更像闭包
     <html>
    <body>
    <script type="text/javascript">
    document.write("Closure Demo!!");
    window.onload=
    function  closureDemoParentFunction(paramA)
    {
       var a = paramA;
       return function closureDemoInnerFunction (paramB)
       {
         alert( a +" "+ paramB);
       };
    };
    var x = closureDemoParentFunction("outer x");
    x("inner x");
    </script>
    </body>
    </html>

    第二  因为javascript是弱类型语言 可以自定义属性new对象  规则是死的 人是活得



    谢谢回复。

    我想问的是。在我给出的那段代码中的作者在文中说的闭包,是指那一句。?
    另外DOM 元素则拥有到 JavaScript obj 的引用 。请问id为element的元素在什么地方引用了obj对象?
    拒绝垃圾代码

    obj.onclick=function innerFunction() 这个不是真正闭包 只是匿名函数而已
    dom自定义属性名称引用对象



    2010年1月3日 8:02

全部回复

  • 第一  是
    这样更像闭包
     <html>
    <body>
    <script type="text/javascript">
    document.write("Closure Demo!!");
    window.onload=
    function  closureDemoParentFunction(paramA)
    {
       var a = paramA;
       return function closureDemoInnerFunction (paramB)
       {
         alert( a +" "+ paramB);
       };
    };
    var x = closureDemoParentFunction("outer x");
    x("inner x");
    </script>
    </body>
    </html>

    第二  因为javascript是弱类型语言 可以自定义属性new对象  规则是死的 人是活得



    2010年1月3日 5:18
  • 第一  是
    这样更像闭包
     <html>
    <body>
    <script type="text/javascript">
    document.write("Closure Demo!!");
    window.onload=
    function  closureDemoParentFunction(paramA)
    {
       var a = paramA;
       return function closureDemoInnerFunction (paramB)
       {
         alert( a +" "+ paramB);
       };
    };
    var x = closureDemoParentFunction("outer x");
    x("inner x");
    </script>
    </body>
    </html>

    第二  因为javascript是弱类型语言 可以自定义属性new对象  规则是死的 人是活得



    谢谢回复。

    我想问的是。在我给出的那段代码中的作者在文中说的闭包,是指那一句。?
    另外DOM 元素则拥有到 JavaScript obj 的引用 。请问id为element的元素在什么地方引用了obj对象?
    拒绝垃圾代码
    2010年1月3日 5:57
  • 第一  是
    这样更像闭包
     <html>
    <body>
    <script type="text/javascript">
    document.write("Closure Demo!!");
    window.onload=
    function  closureDemoParentFunction(paramA)
    {
       var a = paramA;
       return function closureDemoInnerFunction (paramB)
       {
         alert( a +" "+ paramB);
       };
    };
    var x = closureDemoParentFunction("outer x");
    x("inner x");
    </script>
    </body>
    </html>

    第二  因为javascript是弱类型语言 可以自定义属性new对象  规则是死的 人是活得



    谢谢回复。

    我想问的是。在我给出的那段代码中的作者在文中说的闭包,是指那一句。?
    另外DOM 元素则拥有到 JavaScript obj 的引用 。请问id为element的元素在什么地方引用了obj对象?
    拒绝垃圾代码

    obj.onclick=function innerFunction() 这个不是真正闭包 只是匿名函数而已
    dom自定义属性名称引用对象



    2010年1月3日 8:02
  • 谢谢,
    obj.bigString 只是为了说明内存泄露对性能的影响,不是造成内存泄露的原因。
    我去掉这句用IE的检测工具检测还是有内存泄露。

    拒绝垃圾代码
    2010年1月3日 12:10
  • 当不再用这个对象 可以赋值null 释放对象 这样减少内存泄露
    2010年1月3日 14:27