Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我是否正在创建内存泄漏?_Javascript_Memory Leaks - Fatal编程技术网

Javascript 我是否正在创建内存泄漏?

Javascript 我是否正在创建内存泄漏?,javascript,memory-leaks,Javascript,Memory Leaks,我有一个JavaScript闭包,在我的web应用程序的整个生命周期(单个完整的ajax页面)中不断地重新创建它 我想知道它是否造成了内存泄漏 这里有一个例子 有关守则: function CreateLinks() { var ul = $("<ul></ul>").appendTo('div#links'); for (var i in myLinks) { var li = $('<li>' + myLinks[i]

我有一个JavaScript闭包,在我的web应用程序的整个生命周期(单个完整的ajax页面)中不断地重新创建它

我想知道它是否造成了内存泄漏

这里有一个例子

有关守则:

function CreateLinks() {

    var ul = $("<ul></ul>").appendTo('div#links');

    for (var i in myLinks) {

        var li = $('<li>' + myLinks[i].name + '</li>').appendTo(ul);

        //closure starts here
        (function (value) {
            li.click(function (e) {
                $('div#info').append('<label>' + value + '</label><br />');
                RecreateLinks();
            });
        })(myLinks[i].value);

    }
}
函数CreateLinks(){
var ul=$(“
    ”)。附录('div#links'); 用于(MyLink中的var i){ var li=$('
  • '+myLinks[i].name+'
  • ).appendTo(ul); //结束从这里开始 (功能(值){ li.点击(功能(e){ $('div#info')。追加(''+value+'
    '); 重新创建链接(); }); })(myLinks[i].值); } }
    如果您确保避免绑定多个
    单击
    重新创建链接()函数中的
    处理程序,您应该不会有问题;这可以通过显式解除现有节点的绑定、删除DOM节点或确保不会添加多个
    单击
    处理程序来实现

    浏览器在内存分配策略方面越来越好,但你不应该假设太多。如果内存使用是一个大问题,请尽量避免创建太多的闭包,因为您不确定这些闭包是否会被垃圾收集。其中一种方法是使用
    .data()
    存储您的值对象,然后使用通用的单击处理程序而不是闭包


    分析JavaScript并不是那么简单;Chrome确实有一个配置文件工具,可以监控CPU和数据性能。这可以很好地衡量预期的内存消耗,但Chrome并非所有浏览器,请记住这一点。

    根据浏览器的智能程度,在
  • 上设置“myLinks[i].value”属性可能比通过闭包传递更好。当事件处理程序从其作用域之外引用变量时,某些哑浏览器在收集垃圾时会出现问题。JavaScript和DOM运行两个不同的GC,JS没有意识到DOM元素/eventhandler已经消失,变量不再使用。通过javascript正确删除事件处理程序,而不仅仅是处理它所附加的元素,可以解决这个问题

    类似于:

    li.attr('lvalue',myLinks[i].value);
    ...
    var value = $(this).attr('lvalue');
    
    此设置还允许您使用

    $('#links > ul > li').live('click',function(){...});
    

    这样就不需要每次都添加单独的事件。

    在这里结束有什么意义?为什么不说
    var value=myLinks[i].value然后直接运行代码?@Jacob:哦,我明白了。你的意思是
    myLinks[i]。value
    ,对。上面的代码中没有内存泄漏。但是解决这个问题的方法太复杂了闭包有目的性,测试并与我的问题进行比较。。。这一个只输出所有链接的“tres”。您不能将调用放入
    setInterval(方法,10)
    并查看操作系统统计数据,查看浏览器应用程序的内存是否增加?我知道除了闭包还有很多事情要做,但是jQuery的内存效率很高,闭包不是只被
    li
    元素引用,这些元素在
    rescreatelinks()
    中被删除了吗?我无法从
    rescreatelinks()
    访问
    li
    单击处理程序。也许您可以更新JSFIDLE并告诉我您的意思。@capdragon删除元素本身也可以。除非您确定您从未多次绑定单击事件,这提醒我您也可以使用.one()@capdragon添加了另一个您可以采纳的建议。@Jack我感谢您的建议(+1)。尽管如此,仍不乏变通办法或解决方案。我只是想知道关闭是否造成内存泄漏。我想要一些证据来证明这一点和/或我自己可以看到的方法。(+1)谢谢你的建议,这会有用的。。。事情是
    myLinks[i]。值在我的应用程序中是一个相当大的对象。也就是说,它是一个具有许多属性和方法的对象。我在这里把它简单化,作为一个例子。我认为将每个属性/方法映射到li属性是不好的。@capdragon您可以在代码中使用js对象,并在li标记上使用该对象的id。您是对的,我认为这是另一种方式。不过,我真的只是想知道关闭是否会造成内存泄漏。我想要一些证据来证明这一点和/或我自己可以看到的方法。我希望这样的工具存在,从我的经验来看,跟踪网页的内存或cpu使用几乎是不可能的。